web-dev-qa-db-ja.com

JavaオブジェクトをRedisの値として使用する方法

Redisは初めてです。

Jedisをダウンロードして、クラスパスに追加しました。しかし、それはJavaオブジェクトを「値」として格納する方法を提供しません

何かが足りないのですか、それともJedisがJavaオブジェクトを値として保存する方法を提供していませんか?

ありがとう、-Venkat

16
Venkat Teki

直接的な手段はありません。それは、シリアライゼーションと、結果のバイト配列の保存によってのみ実行できます。 Plsは http://static.springsource.org/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html 春を使いたい。

乾杯ムトゥ

7
Muthukumaran

Java- Redisson のRedisベースのフレームワークで簡単に実行できます。

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 JSONAvroSmileCBORMsgPackKryoFSTLZ4SnappyおよびJDK Serialization)。

免責事項:私はRedissonの主要開発者です

8

Javaオブジェクトを値として格納することは、シリアライゼーションを使用して目的を達成することはできますが、Redisの方法ではありません。

Jedis開発者によるこの回答を参照してください: https://stackoverflow.com/a/12355876/2237351

7
deepakborania

Javaオブジェクトをredisの値として保存する直接的な方法はありませんが、Javaオブジェクトをbyte []として保存して取得でき、オブジェクトはByteBufferを使用して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());    

詳細については、こちらをご覧ください: Apache Redisでデータを取得および設定するためのByteBuffer

0
neel4soft

上記のように、直接実行する方法はありませんが、自分で実装することができます(以下の例では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));
    }
}
0
Qy Zuo