/ / Come ottenere tutte le chiavi da Redis usando il modello redis - primavera, redis

Come ottenere tutte le chiavi da Redis usando il modello redis - spring, redis

Sono stato bloccato da questo problema con abbastanzaun po 'di tempo. Voglio ottenere le chiavi da Redis utilizzando il modello Redis. Ho provato this.redistemplate.keys ("*"); ma questo non recupera nulla. Anche con lo schema non funziona.

Potete per favore consigliare su quale sia la migliore soluzione a questo.

risposte:

14 per risposta № 1

Ho appena consolidato le risposte, abbiamo visto qui.

Ecco i due modi per ottenere le chiavi da Redis, quando utilizziamo RedisTemplate.

1. Direttamente da 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);
}

Nota: dovresti aver configurato redisTemplate con StringRedisSerializer nel tuo fagiolo

Se si utilizza la configurazione bean basata su Java

redisTemplate.setDefaultSerializer(new StringRedisSerializer());

Se si utilizza la configurazione bean basata su spring.xml

<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. Da JedisConnectionFactory

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

Se non si chiude esplicitamente questa connessione, si verificherà un esaurimento del pool di connessioni jedis sottostante, come indicato in https://stackoverflow.com/a/36641934/3884173.


8 per risposta № 2

provare:

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 per risposta № 3

Provare redisTemplate.setKeySerializer(new StringRedisSerializer());


1 per risposta № 4

Stavo usando redisTemplate.keys(), ma non funzionava. Quindi ho usato jedis, ha funzionato. Di seguito è riportato il codice che ho usato.

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

0 per risposta № 5

Ha funzionato, ma sembra non raccomandato? Perché non possiamo usare il comando Chiavi in ​​produzione. Presumo RedisTemplate.getConnectionFactory().getConnection().keys sta chiamando il comando redis Keys. Quali sono le alternative?


0 per risposta № 6

La soluzione può essere così

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

O puoi usare jedis.hscan() e ScanParams anziché.