Как использовать объект Java в качестве значения в Redis - PullRequest
12 голосов
/ 06 марта 2012

Я довольно новичок в Redis.

Я скачал Джедаи и добавил это в мой путь к классам. Но он не предоставляет способ сохранить объект Java как «значение»

Я что-то упустил или Jedis не предоставляет способ сохранить объект Java в качестве значения?

Спасибо, -Venkat

Ответы [ 5 ]

7 голосов
/ 09 апреля 2013

Хранение Java-объекта в качестве значения не является повторным способом выполнения вещей, хотя вы можете достичь желаемого с помощью сериализации.

См. Этот ответ разработчика Jedis: https://stackoverflow.com/a/12355876/2237351

7 голосов
/ 26 августа 2016

Вы можете легко сделать это с помощью платформы 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).

7 голосов
/ 31 марта 2012

Прямых средств не существует - это можно сделать только путем сериализации и сохранения результирующего байтового массива. Пожалуйста, обратитесь http://static.springsource.org/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html, если вы хотите использовать пружину.

Приветствие Muthu

0 голосов
/ 21 января 2019

Нет прямого способа сохранить объект 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

0 голосов
/ 14 сентября 2017

Как сказано выше, прямого способа сделать это не существует, но вы можете реализовать его самостоятельно (в приведенном ниже примере используйте 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));
    }
}
...