【问题标题】:How to use java object as a value in Redis如何在 Redis 中使用 java 对象作为值
【发布时间】:2012-03-23 23:29:38
【问题描述】:

我对 Redis 还是很陌生。

我下载了 Jedis 并将其添加到我的类路径中。但是,它没有提供将 java 对象存储为“值”的方法

是我遗漏了什么还是 Jedis 没有提供将 java 对象存储为值的方法?

谢谢, -文卡特

【问题讨论】:

    标签: jedis


    【解决方案1】:

    没有直接的方法——只能通过序列化和存储结果字节数组来完成。如果您想使用弹簧,请参考http://static.springsource.org/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html

    【讨论】:

    • 如果对象是第三方且不可序列化怎么办
    • @User3 在这种情况下,您必须从该第 3 方对象中提取数据并将其复制回您的类型
    • 您也可以使用 ByteBuffer 在 Java 中进行到/从转换,而不是将 ByteBuffer 到/从转换到 byte[] 数组以从 redis 存储/获取。
    【解决方案2】:

    将 java 对象存储为值并不是 redis 的处理方式,尽管您可以使用序列化来完成您想要的操作。

    查看 Jedis 开发人员的这个答案: https://stackoverflow.com/a/12355876/2237351

    【讨论】:

      【解决方案3】:

      您可以使用基于 Redis 的 Java 框架轻松做到这一点 - Redisson:

      RBucket<AnyObject> bucket = redisson.getBucket("anyObject");
      // set an object
      bucket.set(new AnyObject());
      // get an object
      AnyObject myObject = bucket.get();
      
      // supports some useful functions like:
      bucket.trySet(object);
      bucket.compareAndSet(oldObject, newObject);
      AnyObject prevObject = bucket.getAndSet(new AnyObject());
      

      它处理序列化并维护内部连接池,因此您无需每次需要向 Redis 发送对象时都处理它。 Redisson 为您服务。像使用 Java 对象一样使用 Redis。

      它支持许多流行的编解码器(Jackson JSONAvroSmileCBORMsgPackKryoFSTLZ4Snappy 和 @9876543)。

      免责声明:我是 Redisson 的首席开发人员

      【讨论】:

      • 对于redisson要序列化的java对象,类是否应该定义为Serializable?还是我们应该做类似的事情?另外,我不完全理解编解码器的支持。 Radisson 是否为我提供了配置序列化模式(Avro 或 Kyro 等)的选项?
      • @AnirudhJayakumar 对于某些编解码器对象应该实现 Serializable 并且不应该为其他。这是支持的编解码器的full list。您可以通过config.setCodec 方法定义编解码器
      • 你应该声明你是redisson的创始人和首席开发者
      • 我们应该在Redis中使用存储数据库连接java对象吗?
      【解决方案4】:

      正如上面所说,没有直接的方法,但你可以自己实现它(下面的例子使用fastjson进行序列化,你可以自己选择一个):

      public static <T extends Serializable> T putObject(String key, T value, int expireTimeSecs) {
          if (expireTimeSecs < 0) {
              throw new IllegalArgumentException(String.format("Illegal expireTimeSecs = %s", expireTimeSecs));
          }
          try (Jedis jedis = POOL.getResource()) {
              String code;
              if (expireTimeSecs == 0) {
                  code = jedis.set(key, JSON.toJSONString(value));
              } else {
                  code = jedis.setex(key, expireTimeSecs, JSON.toJSONString(value));
              }
              if (!"OK".equalsIgnoreCase(code)) {
                  throw new CacheException("Put object to redis failed!");
              }
          }
          return value;
      }
      
      public static <T extends Serializable> T putObject(String key, T value) {
          return putObject(key, value, 0);
      }
      
      
      public static <T extends Serializable> T getObject(String key, Class<T> clazz) {
          try (Jedis jedis = POOL.getResource()) {
              return JSON.parseObject(jedis.get(key), clazz);
          }
      }
      
      public static Object getObject(String key) {
          try (Jedis jedis = POOL.getResource()) {
              return JSON.parse(jedis.get(key));
          }
      }
      

      【讨论】:

        【解决方案5】:

        没有直接的方法将 Java 对象作为 value 存储在 redis 中,但是可以将 java 对象存储和获取为 byte[],并且可以使用 ByteBuffer 将 Object 转换为 byte[] 数组。

        如果对象具有数值,这甚至可以用于减少 redis 上的内存使用量。

        // Allocating 9 bytes  
        ByteBuffer buffer = ByteBuffer.allocate(9);  
        
        // Storing first row: Hour > Minute > Count  
        buffer.put((byte) 12);  
        buffer.put((byte) 01);  
        buffer.put((byte) 10);  
        
        
        
        
        String key = "k";  
        
        Jedis jedis = new Jedis("127.0.0.1");  
        jedis.set(key.getBytes(), buffer.array());  
        

        在应用程序中获取存储的 ByteBuffer 的值并构造实际存储的值:

        byte [] value= jedis.get(key.getBytes());  
                ByteBuffer valueBuffer = ByteBuffer.wrap(value);  
        
                System.out.println(valueBuffer.get()+","+valueBuffer.get()+","+valueBuffer.get());    
        

        在此处了解更多信息:ByteBuffer to get and set data on Apache Redis

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          • 2019-11-07
          • 2021-04-22
          • 2011-10-21
          • 1970-01-01
          相关资源
          最近更新 更多