/ / Cómo obtener todas las claves de Redis usando la plantilla de redis - spring, redis

Cómo obtener todas las claves de Redis usando la plantilla de redis - spring, redis

He estado atrapado con este problema con bastantealgún tiempo. Quiero obtener claves de redis usando la plantilla redis. He intentado this.redistemplate.keys ("*"); pero esto no es ir a buscar nada. Incluso con el patrón no funciona.

¿Puede por favor aconsejar sobre cuál es la mejor solución para esto?

Respuestas

14 para la respuesta № 1

Acabo de consolidar las respuestas, las hemos visto aquí.

Estas son las dos formas de obtener claves de Redis, cuando usamos RedisTemplate.

1. Directamente desde 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: deberías haber configurado redisTemplate con StringRedisSerializer en tu frijol

Si usas configuración de bean basada en Java

redisTemplate.setDefaultSerializer(new StringRedisSerializer());

Si utiliza la configuración basada en spring.xml bean

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

Si no cierra esta conexión explícitamente, se encontrará con un agotamiento de la agrupación de conexiones jedis subyacente como se indica en https://stackoverflow.com/a/36641934/3884173.


8 para la respuesta № 2

tratar:

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 para la respuesta № 3

Tratar redisTemplate.setKeySerializer(new StringRedisSerializer());


1 para la respuesta № 4

Estaba usando redisTemplate.keys(), pero no estaba funcionando. Así que usé jedis, funcionó. El siguiente es el código que utilicé.

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

0 para la respuesta № 5

¿Funcionó, pero parece que no es recomendable? Porque no podemos usar el comando Keys en producción. Supongo que RedisTemplate.getConnectionFactory().getConnection().keys Está llamando el comando redis Keys. ¿Cuáles son las alternativas?


0 para la respuesta № 6

La solución puede ser así.

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

O puedes usar jedis.hscan() y ScanParams en lugar.