如何在Redis中使用Java对象作为值

26

我对Redis还不太熟悉。

我下载了Jedis并将其添加到我的类路径中。但是,它似乎没有提供一种存储Java对象作为“value”的方法。

我是否遗漏了什么或者Jedis确实没有提供将Java对象作为值存储的方法?

谢谢, -Venkat

5个回答

16

你可以使用基于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 JSON、Avro、Smile、CBOR、MsgPack、Kryo、FST、LZ4、Snappy和JDK Serialization)。免责声明:我是Redisson的首席开发人员。

Java对象要被Redisson序列化,是否需要将类定义为Serializable?或者我们需要做类似的事情吗?此外,我不完全理解编解码器支持。Redisson是否提供了配置序列化模式(如Avro或Kyro)的选项? - Anirudh Jayakumar
1
@AnirudhJayakumar 对于某些编解码器,对象应该实现Serializable接口,而对于其他编解码器则不需要。这里是支持的编解码器的完整列表。您可以通过config.setCodec方法定义编解码器。 - Nikita Koksharov
3
你应该放置一个免责声明,说明你是redisson的创始人和首席开发者。 - Arthur Kalimullin
我们应该在Redis中使用一个存储数据库连接的Java对象吗? - Shubham Khandare

9

2
如果对象是第三方的且不可序列化,该怎么办? - User3
在这种情况下,您必须从第三方对象中提取数据并将其复制回您的类型。 - asgs
您可以在Java中使用ByteBuffer进行转换,然后将其转换为byte[]数组以存储/获取redis中的数据。 - neel4soft

7

0
正如上面所说,没有直接的方法来实现这一点,但是您可以自己实现(下面的示例使用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));
    }
}

0

在Redis中没有直接存储Java对象的方法,但可以将Java对象以byte[]的形式进行存储和获取,并且可以使用ByteBuffer将对象转换为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在Apache Redis上获取和设置数据


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接