我有一个包含所有类型数据类型的复杂 java 对象。我们需要将该对象推送到 Redis 缓存中,以字符串为键,值就是该对象。我们有 6 台机器的 Redis 集群。
如何使用 lettuce 集群客户端通过 java 代码推送这个对象?
你有两个选择:
RedisCodec
来完成这项工作(请参阅CustomCodecTest.java或CustomCodecTest.java)这是将对象保存为序列化形式的自定义 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));