【问题标题】:Can Jedis get/set an Java POJO?Jedis 可以获取/设置 Java POJO 吗?
【发布时间】:2012-08-30 00:51:45
【问题描述】:

我使用 Jedis 作为 java 客户端连接到 Redis 服务器。

问题一:好像没有办法获取/设置对象 ?所有的值都必须是 String 还是 byte[]?

其他客户端,如“JRedis”和 Spymemcache(用于 memcached 服务器)可以。

问题2:如果我使用ShardedJedis,它不能设置auth/password?而 Jedis 类可以(使用 auth(String password))。

【问题讨论】:

    标签: jedis


    【解决方案1】:

    关于问题 1:Jedis 不会处理 POJO。您应该序列化为字符串或字节 [] 并使用 jedis 来执行此操作,尽管我不建议存储您的 java 对象序列化,因为您将无法使用所有 Redis 酷特性。另一种方法是使用对象哈希映射器之类的东西,例如JOhm

    关于问题 2:ShardedJedis 将仅支持在单个键上运行的命令。这是为了保证原子性。如果你想在特定的 redis 上运行特定的命令,你应该使用shardedJedis.getShard('someky'),它将返回一个你可以使用的Jedis 实例。 推荐的另一种处理方法是在JedisShardInfo 实例中指定您的密码。 您可以在tests 中查看相关示例。

    【讨论】:

    • @xertorthio:感谢分享 JOhm 项目的链接,某些看起来很有趣!但是,当您提到“我不建议将您的 java 对象序列化存储,因为您将无法使用所有 Redis 酷特性”时,您指的是哪些其他 Redis 酷特性?
    • @Nishant 我猜他的意思是像 INCR 这样的东西对你的数据进行原子更改。
    • 似乎 johm 项目不活跃。这是该项目的一个活跃分支:johm
    【解决方案2】:

    问题 1 的答案:

    Redisson(Redis Java 客户端)可以使用 POJO 对象。而且您不需要每次都自己序列化/反序列化对象并使用连接(获取/释放)。这一切都由 Redisson 完成。

    这是一个例子:

    RBucket<AnyObject> bucket = redisson.getBucket("anyObject");
    // set an object
    bucket.set(new AnyObject());
    // get an object
    AnyObject myObject = bucket.get();
    

    或者您可以使用LiveObjectService,它将 POJO 字段作为键存储在 Redis 哈希对象中。

    @REntity
    public class MyObject {
    
       @RId
       private String id;
       @RIndex
       private String value;
       private MyObject parent;
    
       public MyObject(String id) {
           this.id = id;
       }
    
       public MyObject() {
       }
    
       // getters and setters
    
    }
    

    Redisson 支持许多流行的编解码器,例如 Jackson JSONAvroSmileCBORMsgPackKryoFSTLZ4JDK Serialization 和 @987654。 /p>

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 2017-10-12
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2018-03-31
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多