2015-07-24 10 views
11

ich in der Lage bin Werte abrufen aus Redis mit Jedis:Get Set Wert von Redis mit 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(); 
    } 

Aber wenn ich Spring zu verwenden versuchen RedisTemplate, ich bin keine Daten zu bekommen. Meine Daten werden in Redis als Set gespeichert.

 // 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 ""; 
    } 

Kann mir jemand bitte aufzeigen, was ich vermisse?

EDIT: Meine XML-Konfiguration für 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

Können Sie Ihre XML-Konfiguration/@ Konfiguration der RedisTemplate? – mp911de

+0

@ mp911de hinzugefügt. – Zeeshan

+0

Danke, bestätigt meine Annahme. – mp911de

Antwort

20

Kurz

Sie haben Serializer zu konfigurieren.

Erklärung

Die Redis Vorlage verwendet Serializer für Schlüssel, Werte und Hash-Schlüssel/Werte. Serializer werden verwendet, um die Java-Eingabe in die Repräsentation zu konvertieren, die in Redis gespeichert ist. Wenn Sie nichts konfigurieren, wird der Serializer standardmäßig auf JdkSerializationRedisSerializer gesetzt. Also, wenn Sie für einen Schlüssel key in Ihrem Java-Code fragen, konvertiert der Serializer es

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

und Spring Data Redis verwendet diese Bytes als Schlüssel Redis abzufragen.

Sie können Daten mit Spring Data Redis hinzufügen und Abfrage es mit dem redis-cli:

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

und dann in die 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" 

Wie Sie serialisiert zu sehen, sind die String und das Datum in einige verrückte Bytes, die ein Java-serialisiertes Objekt darstellen.

Ihr Code schlägt vor, dass Sie String-basierte Schlüssel und Werte speichern möchten. Nur stellen Sie die StringRedisSerializer in Ihrem RedisTemplate

Java Konfiguration

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

XML-Konfiguration

<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"/> 

Der Ausgang nach dem Ausführen von Code sieht aus wie dann:

value 
key 
[value] 

Spring Data Redis hat einige interessante Serializer, die den Nachrichtenaustausch zwischen verschiedenen Systemen ermöglichen.Sie können

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

oder erstellen Sie Ihre eigenen entweder aus den eingebauten in Serializer wählen.

Ich habe Spring Data Redis 1.5.1.RELEASE und jedis 2.6.2 verwendet, um das Ergebnis Ihrer Frage zu überprüfen. lesen HTH, Mark

Weitere:

+0

Ich erhalte folgenden Fehler: Fehler beim Erstellen von Bean mit dem Namen 'Listener' definiert in der ServletContext-Ressource [/WEB-INF/root-context.xml]: Aufruf der Init-Methode fehlgeschlagen; verschachtelte Ausnahme ist java.lang.IllegalArgumentException: RedisConnectionFactory ist erforderlich – Zeeshan

+0

Funktioniert gut mit Java-Konfiguration. Ich weiß nicht, warum ich Fehler für xml conf bekomme. Danke – Zeeshan

+1

Ich hatte die ConnectionFactory aus dem XML-Beispiel entfernt. Ich habe den Code aktualisiert, jetzt funktioniert es. Danke für den Tipp. – mp911de

0

Sie tun könnte es viel einfacher, mit 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(); 
} 

Diese framewrok Griffe Serialisierung und die Arbeit mit Verbindung, so dass Sie nicht brauchen um es jedes Mal zu bewältigen. Arbeiten Sie mit Redis, wie Sie es gewohnt sind, mit Java-Objekten (Set, Map, List ...) zu arbeiten. Es unterstützt auch viele gängige Codecs.