【问题标题】:Lettuce multiple reactive Redis stores and transactions across storesLettuce 多个反应式 Redis 存储和跨存储事务
【发布时间】:2019-04-26 19:07:35
【问题描述】:

我正在学习 Redis for Java,我认为我真的很想念 Redis api。
假设我们有以下用于创建连接的代码:

RedisClient redisClient = RedisClient
  .create("redis://password@localhost:6379/");
StatefulRedisConnection<String, String> connection
 = redisClient.connect();

这为键类型字符串和值类型字符串定义了一个客户端。
现在,当我需要处理多个 Redis 对象时,我该怎么办?不仅是字符串/字符串,还包括具有不同类型的多个集合?
我应该为每个创建不同的连接吗?
我曾尝试使用反应式模板,但遇到了同样的问题,即我会创建多个不同类型的实例。

在处理事务时,我不明白如何跨单个模板使用事务。
例如,我想将一个序列化的帖子插入到 Redis 存储中,例如:

Key postId | Value <post> 

但在一个事务中,我还想在代表提要的集合中添加 postId:

Key topic | Value <set with post Id's>

我发现的所有示例都在同一个模板上执行事务,但我不知道如何继续。
指针表示赞赏。

【问题讨论】:

  • 用StatefulRedisConnection怎么样
  • 一个工作示例将不胜感激。我目前通过删除地图 postId-post 来解决它,因为我真的不需要它并将帖子直接存储在 zset 中。但这只是一个幸运的巧合。我意识到 Redis 不是关系型的……但不知何故,我认为它可以做到这一点。

标签: java redis lettuce


【解决方案1】:

定义StatefulRedisConnection 时的String, String 部分仅适用于正在使用的编解码器。当你定义:

StatefulRedisConnection<String, String> connection = redisClient.connect();

RedisClient 使用预定义的StringCodec 在 java 客户端和 Redis 之间传输数据。

如果您想在 Redis 和客户端之间来回传输数据时更改键和值的编码和解码方式,可以在此处使用您的自定义编解码器。更多关于 RedisCodec 的细节here

为了您的问题。您仍然应该能够不同类型的操作使用相同的连接,只要键和值都是Strings .对于Object 类型的键和值,您应该将它们序列化并将序列化结果传递给上述连接。

这是一个示例 sn-p(没有运行/测试这个)。

RedisClient redisClient = RedisClient.create("redis://password@localhost:6379/0");
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisCommands<String, String> syncCommands = connection.sync();
syncCommands.multi();
syncCommands.sadd("topics", "value1", "value2", "value3"); // Puts topics in the set
syncCommands.set("posts", "serialized post"); // Puts serialized post
syncCommands.exec();

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 2017-12-27
    • 2020-01-17
    • 1970-01-01
    • 2019-09-07
    • 2022-10-19
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多