【发布时间】:2012-03-23 23:29:38
【问题描述】:
我对 Redis 还是很陌生。
我下载了 Jedis 并将其添加到我的类路径中。但是,它没有提供将 java 对象存储为“值”的方法
是我遗漏了什么还是 Jedis 没有提供将 java 对象存储为值的方法?
谢谢, -文卡特
【问题讨论】:
标签: jedis
我对 Redis 还是很陌生。
我下载了 Jedis 并将其添加到我的类路径中。但是,它没有提供将 java 对象存储为“值”的方法
是我遗漏了什么还是 Jedis 没有提供将 java 对象存储为值的方法?
谢谢, -文卡特
【问题讨论】:
标签: jedis
没有直接的方法——只能通过序列化和存储结果字节数组来完成。如果您想使用弹簧,请参考http://static.springsource.org/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html。
【讨论】:
将 java 对象存储为值并不是 redis 的处理方式,尽管您可以使用序列化来完成您想要的操作。
查看 Jedis 开发人员的这个答案: https://stackoverflow.com/a/12355876/2237351
【讨论】:
您可以使用基于 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 和 @9876543)。
免责声明:我是 Redisson 的首席开发人员
【讨论】:
config.setCodec 方法定义编解码器
正如上面所说,没有直接的方法,但你可以自己实现它(下面的例子使用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));
}
}
【讨论】:
没有直接的方法将 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());
【讨论】: