2013-09-30 17 views
7

Ich habe mit diesem Problem mit ziemlich viel Zeit stecken.Ich möchte Schlüssel von redis mit redis Vorlage erhalten. Ich habe this.redistemplate.keys ("*") versucht; aber das bringt nichts. Selbst mit dem Muster funktioniert es nicht.Wie bekomme ich alle Schlüssel von Redis mit redis Vorlage

Können Sie bitte beraten, was die beste Lösung dafür ist.

Antwort

8

Versuch:

Set<byte[]> keys = RedisTemplate.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)); 
} 
3

Versuchen redisTemplate.setKeySerializer(new StringRedisSerializer());

0

Es hat funktioniert, aber es scheint nicht zu empfehlen? Weil wir den Keys-Befehl in der Produktion nicht verwenden können. Ich nehme an, RedisTemplate.getConnectionFactory().getConnection().keys ruft redis Keys Befehl. Was sind die Alternativen?

0

Lösung kann wie dieses

String pattern = "abc"+"*"; 
Set<String> keys = jedis.keys(pattern); 
for (String key : keys) { 
    jedis.keys(key); 
} 

werden oder Sie können jedis.hscan() und ScanParams stattdessen verwenden.

11

Ich habe nur die Antworten konsolidiert, die wir hier gesehen haben.

Hier sind die zwei Möglichkeiten, Schlüssel von Redis zu bekommen, wenn wir RedisTemplate verwenden.

1. Direkt von RedisTemplate

Set<String> redisKeys = template.keys("samplekey*")); 
// Store the keys in a List 
List<String> keysList = new ArrayList<>(); 
Iterator<String> it = redisKeys.iterator(); 
while (it.hasNext()) { 
     String data = it.next(); 
     keysList.add(data); 
} 

Hinweis: Sie sollten redisTemplate mit StringRedisSerializer in Ihrem Bean

Wenn Sie Java-basierte Bohne Konfiguration

redisTemplate.setDefaultSerializer(new StringRedisSerializer()); 
konfiguriert haben

Wenn Sie spring.xml basierte Bohne Konfiguration

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

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

2. Von JedisConnectionFactory verwenden

RedisConnection redisConnection = template.getConnectionFactory().getConnection(); 
Set<byte[]> redisKeys = redisConnection.keys("samplekey*".getBytes()); 
List<String> keysList = new ArrayList<>(); 
Iterator<byte[]> it = redisKeys.iterator(); 
while (it.hasNext()) { 
     byte[] data = (byte[]) it.next(); 
     keysList.add(new String(data, 0, data.length)); 
} 
redisConnection.close(); 

Wenn Sie explizit diese Verbindung nicht schließen, werden Sie in eine Erschöpfung des Laufes zugrunde liegenden jedis Verbindung Pool wie in https://stackoverflow.com/a/36641934/3884173.

+0

Das hat mir sehr geholfen, verdient mehr Upvotes !! – varunkr

+0

Dies sollte die akzeptierte Antwort sein. –

0

Ich habe redisTemplate.keys() verwendet, aber es hat nicht funktioniert. Also habe ich Jedis benutzt, es hat funktioniert. Der folgende Code ist der Code, den ich verwendet habe.

Jedis jedis = new Jedis("localhost", 6379); 
    Set<String> keys = jedis.keys("*".getBytes()); 
    for (String key : keys) { 
     // do something 
    } // for