Подтвердить что ты не робот

Как использовать объект java в качестве значения в Redis

Я новичок в Redis.

Я загрузил Jedis и добавил это к моему пути к классам. Но он не обеспечивает способ хранения java-объекта как "значение"

Мне что-то не хватает, или Jedis не предоставляет способ хранения java-объекта в качестве значения?

Спасибо, -Venkat

4b9b3361

Ответ 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