web-dev-qa-db-fra.com

Comment utiliser Java comme valeur dans Redis

Je suis assez nouveau à Redis.

J'ai téléchargé Jedis et l'ai ajouté à mon chemin de classe. Mais, il ne fournit pas un moyen de stocker Java objet en tant que "valeur"

Suis-je en train de manquer quelque chose ou Jedis ne fournit pas le moyen de stocker Java objet comme valeur?

Merci, -Venkat

16
Venkat Teki

Il n'y a pas de moyen direct - cela ne peut être fait que via la sérialisation et le stockage du tableau d'octets résultant. Veuillez consulter http://static.springsource.org/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html si vous veulent utiliser le printemps.

Cheers Muthu

7
Muthukumaran

Vous pouvez facilement le faire avec le framework basé sur Redis pour 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());

Il gère la sérialisation et fonctionne avec la connexion, vous n'avez donc pas besoin de le gérer à chaque fois que vous devez envoyer un objet à Redis. Redisson le fait pour vous. Travaillez avec Redis comme vous le faisiez avec les objets Java.

Il prend en charge de nombreux codecs populaires (Jackson JSON, Avro, Smile, CBOR, MsgPack, Kryo, FST, LZ4, Snappy et JDK Serialization).

DISCLAMER: Je suis un développeur principal de Redisson

8
Nikita Koksharov

Stocker Java objet en tant que valeur n'est pas la nouvelle façon de faire des choses bien que vous puissiez accomplir ce que vous voulez en utilisant la sérialisation.

Voir cette réponse du développeur Jedis: https://stackoverflow.com/a/12355876/2237351

7
deepakborania

Il n'y a aucun moyen direct de stocker un objet Java comme valeur dans redis, mais on peut stocker et obtenir un objet Java comme octet [] et l'objet peut être converti en/vers un tableau d'octets [] à l'aide de ByteBuffer.

Cela peut être utilisé pour réduire même l'utilisation de la mémoire sur redis si l'objet a des valeurs numériques.

// 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());  

pour obtenir la valeur de ByteBuffer stocké dans l'application et construire la valeur réelle, celle-ci a été stockée:

byte [] value= jedis.get(key.getBytes());  
        ByteBuffer valueBuffer = ByteBuffer.wrap(value);  

        System.out.println(valueBuffer.get()+","+valueBuffer.get()+","+valueBuffer.get());    

En savoir plus à ce sujet ici: ByteBuffer pour obtenir et définir des données sur Apache Redis

0
neel4soft

Comme il est dit ci-dessus, il n'y a pas de moyen direct de le faire, mais vous pouvez l'implémenter vous-même (exemple ci-dessous, utilisez fastjson pour faire la sérialisation, vous pouvez en choisir un vous-même):

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