4

我有一个包含所有类型数据类型的复杂 java 对象。我们需要将该对象推送到 Redis 缓存中,以字符串为键,值就是该对象。我们有 6 台机器的 Redis 集群。

如何使用 lettuce 集群客户端通过 java 代码推送这个对象?

4

2 回答 2

8

你有两个选择:

  1. 您自己执行序列化(JDK 序列化、JSON、Protobuf,...)。您可以在将数据发送到 Redis 之前执行此操作,或者您实现自己的RedisCodec来完成这项工作(请参阅CustomCodecTest.javaCustomCodecTest.java
  2. 在 lettuce 前面使用一个框架(例如Spring Data Redis)。Spring Data Redis 附带了各种开箱即用的序列化编解码器。
于 2016-08-30T12:39:32.713 回答
0

这是将对象保存为序列化形式的自定义 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));
于 2021-11-29T04:26:31.543 回答