Как использовать объект java в качестве значения в Redis
Я новичок в Redis.
Я загрузил Jedis и добавил это к моему пути к классам. Но он не обеспечивает способ хранения java-объекта как "значение"
Мне что-то не хватает, или Jedis не предоставляет способ хранения java-объекта в качестве значения?
Спасибо,
-Venkat
Ответы
Ответ 1
Прямых средств не существует - это можно сделать только путем сериализации и сохранения результирующего байтового массива. Пожалуйста, обратитесь http://static.springsource.org/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html, если вы хотите использовать пружину.
ура
Muthu
Ответ 2
Вы можете легко сделать это с помощью среды на основе 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 делает это для вас. Работайте с Redis, как вы привыкли работать с объектами Java.
Он поддерживает множество популярных кодеков (Jackson JSON
, Avro
, Smile
, CBOR
, MsgPack
, Kryo
, FST
, LZ4
, Snappy
и JDK Serialization
).
ДИСКЛАМЕР: я ведущий разработчик Redisson
Ответ 3
Сохранение java-объекта в качестве значения не является повторным способом делать вещи, хотя вы можете выполнить то, что хотите, используя сериализацию.
См. этот ответ разработчика Jedis:
fooobar.com/questions/348561/...
Ответ 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-объект как значение в Redis, однако можно сохранить и получить Java-объект как byte [], и объект можно преобразовать в/из массива byte [] с помощью ByteBuffer.
Это можно использовать даже для уменьшения использования памяти при повторном использовании, если объект имеет числовые значения.
// 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