2015-07-24 14 views
11

sono in grado di recuperare i valori da Redis utilizzando Jedis:Get Set valore da Redis utilizzando RedisTemplate

public static void main(String[] args) { 
     Jedis jedis = new Jedis(HOST, PORT); 
     jedis.connect(); 
     Set<String> set = jedis.smembers(KEY); 
     for (String s : set) { 
      System.out.println(s); 
     } 
     jedis.disconnect(); 
     jedis.close(); 
    } 

Ma quando sto cercando di utilizzare Primavera di RedisTemplate, non ricevo alcun dato. I miei dati vengono memorizzati in Redis come Set.

 // inject the actual template 
     @Autowired 
     private RedisTemplate<String, Object> template; 

     // inject the template as SetOperations 
     @Resource(name="redisTemplate") 
     private SetOperations<String,String> setOps; 

public String logHome() {  
     Set<String> set = setOps.members(KEY); 
     for(String str:set){ 
      System.out.println(str); //EMPTY 
     }  
     Set<byte[]> keys = template.getConnectionFactory().getConnection().keys("*".getBytes()); 
     Iterator<byte[]> it = keys.iterator(); 
     while(it.hasNext()){ 
      byte[] data = (byte[])it.next(); 
      System.out.println(new String(data, 0, data.length)); //KEYS are printed. 
     } 
     Set<Object> mySet = template.boundSetOps(KEY).members();   
     System.out.println(mySet); //EMPTY  
     return ""; 
    } 

Qualcuno può indicare a me che cosa mi manca?

MODIFICA: La mia configurazione xml per RedisTemplate.

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" 
    p:connection-factory-ref="jedisConnectionFactory"/> 

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
     p:host-name="myhostname" p:port="6379" /> 
+0

È possibile pubblicare la configurazione XML/@ Configurazione di RedisTemplate? – mp911de

+0

@ mp911de aggiunto. – Zeeshan

+0

Grazie, conferma la mia ipotesi. – mp911de

risposta

20

Insomma

si deve configurare serializzatori.

Spiegazione

Il modello Redis usa serializzatori per le chiavi, i valori e le chiavi di hash/valori. I serializzatori vengono utilizzati per convertire l'input Java nella rappresentazione memorizzata in Redis. Se non si configura nulla, il serializzatore assume come valore predefinito JdkSerializationRedisSerializer. Quindi, se chiedete una chiave key nel codice Java, il serializzatore converte in

"\xac\xed\x00\x05t\x00\x03key" 

e Spring dati Redis utilizza tali byte come la chiave per interrogare Redis.

È possibile aggiungere dati con la Primavera dei dati Redis ed interrogare utilizzando il redis-cli:

template.boundSetOps("myKey").add(new Date()); 

e poi nel redis-cli

127.0.0.1:6379> keys * 
1) "\xac\xed\x00\x05t\x00\x05myKey" 
127.0.0.1:6379> SMEMBERS "\xac\xed\x00\x05t\x00\x05myKey" 
1) "\xac\xed\x00\x05sr\x00\x0ejava.util.Datehj\x81\x01KYt\x19\x03\x00\x00xpw\b\x00\x00\x01N\xcf#\x9cHx" 

Come si vede, la corda e la data vengono serializzati in alcuni pazzi byte che rappresentano un oggetto serializzato Java.

Il codice suggerisce di voler memorizzare chiavi e valori basati su stringhe. Basta impostare il StringRedisSerializer nella configurazione RedisTemplate

Java

redisTemplate.setKeySerializer(new StringRedisSerializer()); 
redisTemplate.setValueSerializer(new StringRedisSerializer()); 

configurazione XML

<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/> 

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" 
    p:connection-factory-ref="jedisConnectionFactory"> 
    <property name="keySerializer" ref="stringSerializer"/> 
    <property name="valueSerializer" ref="stringSerializer"/> 
</bean> 

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
    p:host-name="myhostname" p:port="6379"/> 

L'uscita dopo l'esecuzione il codice sia poi:

value 
key 
[value] 

Spring Data Redis ha alcuni serializzatori interessanti che consentono lo scambio di messaggi tra vari sistemi.È possibile scegliere dai serializzatori built-in

  • JacksonJsonRedisSerializer
  • Jackson2JsonRedisSerializer
  • JdkSerializationRedisSerializer (default)
  • OxmSerializer
  • GenericToStringSerializer

oppure crearne uno tuo.

Ho utilizzato Spring Data Redis 1.5.1.RELEASE e jedis 2.6.2 per verificare il risultato della domanda. HTH, Mark

Ulteriori leggere:

+0

Viene visualizzato l'errore seguente: Errore nella creazione di bean con nome 'listener' definito nella risorsa ServletContext [/WEB-INF/root-context.xml]: Invocazione del metodo init non riuscita; l'eccezione annidata è java.lang.IllegalArgumentException: è richiesto RedisConnectionFactory – Zeeshan

+0

Funzionante correttamente con la configurazione java. Non so perché sto ricevendo errori per conf xml. Grazie – Zeeshan

+1

Ho avuto la connessione Factory rimosso dall'esempio XML. Ho aggiornato il codice, ora funziona. Grazie per il suggerimento. – mp911de

0

Si potrebbe fare molto più facile con Redisson:

public static void main(String[] args) { 
    Config conf = new Config(); 
    conf.useSingleServer().setAddress(host + ":" + port); 

    RedissonClient redisson = Redisson.create(conf); 
    RSet<String> set = redisson.getSet(KEY) 
    for (String s : set.readAllValues()) { 
     System.out.println(s); 
    } 
    redisson.shutdown(); 
} 

Questo framewrok gestisce la serializzazione e lavorare con connessione in modo da non aver bisogno occuparsene ogni volta Lavora con Redis mentre lavoravi con gli oggetti Java (Set, Map, List ...). Supporta anche molti codec popolari.