21

我对 Redis 很陌生。

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

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

谢谢,-文卡特

4

5 回答 5

15

您可以使用基于 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 JSONAvroSmileCBORMsgPackKryoFSTLZ4)。SnappyJDK Serialization

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

于 2016-08-26T11:10:54.730 回答
9

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

于 2012-03-30T23:32:02.030 回答
7

将 java 对象存储为值不是 redis 做事的方式,尽管您可以使用序列化来完成您想要的事情。

请参阅 Jedis 开发人员的此答案: https ://stackoverflow.com/a/12355876/2237351

于 2013-04-09T12:22:07.240 回答
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));
    }
}
于 2017-09-14T09:25:30.990 回答
0

没有直接的方法将 Java 对象作为值存储在 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 以在 Apache Redis 上获取和设置数据

于 2019-01-21T08:09:43.523 回答