如何使用 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 代码推送此对象?

您有两个选择:

  1. 您自己执行序列化(JDK 序列化,JSON,Protobuf,...)。您可以在将数据发送到 Redis 之前执行此操作,或者您实现自己的 RedisCodec 来完成这项工作(请参阅 CustomCodecTest.java or CustomCodecTest.java
  2. 在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));