2012-03-06 12 views
9

Jestem całkiem nowy dla Redis.Jak używać obiektu java jako wartości w Redis

Pobrałem Jedisa i dodałem do mojej ścieżki klas. Ale nie zapewnia sposobu przechowywania obiektu java jako "wartości"

Czy czegoś brakuje, czy Jedis nie zapewnia sposobu przechowywania obiektu Java jako wartości?

dzięki, -Venkat

Odpowiedz

3

nie istnieje bezpośredni sposób - mogą być wykonywane tylko poprzez szeregowanie i przechowywanie otrzymanej bajt tablicy. Pls polecają http://static.springsource.org/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html, jeśli chcesz użyć sprężyny.

Cheers Muthu

+2

co jeśli obiekt jest podmiotem zewnętrznym i nie można go przekształcić w kodowanie – User3

+0

@ Użytkownik3, w takim przypadku należy wyodrębnić dane z tego obiektu strony trzeciej i skopiować je z powrotem do typu: – asgs

4

można łatwo zrobić z Redis ram opartych na Javie - 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()); 

Obsługuje serializacji i pracować z połączenia, dzięki czemu nie trzeba za każdym razem radzić sobie z tym, kiedy musisz wysłać obiekt do Redis. Redisson robi to za Ciebie. Pracuj z Redis, jak zwykłeś pracować z obiektami Java.

Obsługuje wiele popularnych kodeków (Jackson JSON, Avro, Smile, CBOR, MsgPack, Kryo, FST, LZ4, Snappy i JDK Serialization).

+0

Dla obiektów java, które mają być serializowane przez redisson, jeśli klasa będzie zdefiniowana jako Serializowalna ? A może powinniśmy zrobić coś podobnego? Ponadto, nie rozumiem w pełni obsługi kodeków. Czy Radisson daje mi opcję konfiguracji trybu serializacji (Avro, Kyro itp.)? –

+1

@AirirudhJayakumar Dla niektórych kodeków obiekt powinien implementować Serializable i nie powinien dla innych. Oto pełna lista obsługiwanych kodeków (https://github.com/redisson/redisson/wiki/4.-data-serialization). Możesz zdefiniować kodek za pomocą metody 'config.setCodec' –

0

Jak mówi powyżej, nie ma bezpośredni sposób to zrobić, ale można wdrożyć siebie (przykład poniżej użycie fastjson zrobić serializacji, można wybrać samemu):

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)); 
    } 
} 
Powiązane problemy