如何使用 lettuce 4.2 集群客户端将复杂的 java 对象推送到 Redis
How to push complex java objects to Redis using lettuce 4.2 Cluster client
我有一个包含所有数据类型的复杂 java 对象。我们需要把这个对象推送到 Redis 缓存中,以字符串为键,值就是这个对象。我们有 6 台机器的 Redis 集群。
如何使用 lettuce 集群客户端通过 java 代码推送此对象?
您有两个选择:
- 您自己执行序列化(JDK 序列化,JSON,Protobuf,...)。您可以在将数据发送到 Redis 之前执行此操作,或者您实现自己的
RedisCodec
来完成这项工作(请参阅 CustomCodecTest.java or CustomCodecTest.java)
- 在lettuce前面使用一个框架(比如Spring Data Redis)。 Spring Data Redis 附带各种编解码器,提供开箱即用的序列化。
这是将对象保存为序列化形式的自定义RedisCodec:
StatefulRedisConnection<String, Object> connect = RedisClient.create(redisUri).connect(
new RedisCodec<String, Object>() {
private final ByteArrayCodec byteArrayCodec = new ByteArrayCodec();
@Override
public String decodeKey(ByteBuffer byteBuffer) {
return Charset.defaultCharset().decode(byteBuffer).toString();
}
@Override
public Object decodeValue(ByteBuffer bytes) {
try (ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(byteArrayCodec.decodeValue(bytes)))) {
return is.readObject();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
public ByteBuffer encodeKey(String s) {
return Charset.defaultCharset().encode(s);
}
@Override
public ByteBuffer encodeValue(Object o) {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bos)) {
os.writeObject(o);
return byteArrayCodec.encodeValue(bos.toByteArray());
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
}
);
RedisCommands<String, Object> commands = connect.sync();
List<String> input = Arrays.asList("this", "is", "a", "test");
commands.set("test", input);
Object result = commands.get("test");
assert (result.equals(input));
我有一个包含所有数据类型的复杂 java 对象。我们需要把这个对象推送到 Redis 缓存中,以字符串为键,值就是这个对象。我们有 6 台机器的 Redis 集群。
如何使用 lettuce 集群客户端通过 java 代码推送此对象?
您有两个选择:
- 您自己执行序列化(JDK 序列化,JSON,Protobuf,...)。您可以在将数据发送到 Redis 之前执行此操作,或者您实现自己的
RedisCodec
来完成这项工作(请参阅 CustomCodecTest.java or CustomCodecTest.java) - 在lettuce前面使用一个框架(比如Spring Data Redis)。 Spring Data Redis 附带各种编解码器,提供开箱即用的序列化。
这是将对象保存为序列化形式的自定义RedisCodec:
StatefulRedisConnection<String, Object> connect = RedisClient.create(redisUri).connect(
new RedisCodec<String, Object>() {
private final ByteArrayCodec byteArrayCodec = new ByteArrayCodec();
@Override
public String decodeKey(ByteBuffer byteBuffer) {
return Charset.defaultCharset().decode(byteBuffer).toString();
}
@Override
public Object decodeValue(ByteBuffer bytes) {
try (ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(byteArrayCodec.decodeValue(bytes)))) {
return is.readObject();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
public ByteBuffer encodeKey(String s) {
return Charset.defaultCharset().encode(s);
}
@Override
public ByteBuffer encodeValue(Object o) {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bos)) {
os.writeObject(o);
return byteArrayCodec.encodeValue(bos.toByteArray());
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
}
);
RedisCommands<String, Object> commands = connect.sync();
List<String> input = Arrays.asList("this", "is", "a", "test");
commands.set("test", input);
Object result = commands.get("test");
assert (result.equals(input));