How to get all Keys from Redis using redis templat

2020-06-01 08:46发布

I have been stuck with this problem with quite some time.I want to get keys from redis using redis template. I tried this.redistemplate.keys("*"); but this doesn't fetch anything. Even with the pattern it doesn't work.

Can you please advise on what is the best solution to this.

标签: spring redis
7条回答
兄弟一词,经得起流年.
2楼-- · 2020-06-01 08:58

try:

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));
}
查看更多
Anthone
3楼-- · 2020-06-01 09:02

Avoid to use keys command. It may ruin performance when it is executed against large databases.

You should use scan command instead. Here is how you can do it:

RedisConnection redisConnection = null;
try {
    redisConnection = redisTemplate.getConnectionFactory().getConnection();
    ScanOptions options = ScanOptions.scanOptions().match("myKey*").count(100).build();

    Cursor c = redisConnection.scan(options);
    while (c.hasNext()) {
        logger.info(new String((byte[]) c.next()));
    }
} finally {
    redisConnection.close(); //Ensure closing this connection.
}

or do it much simplier with Redisson Redis Java client:

Iterable<String> keysIterator = redisson.getKeys().getKeysByPattern("test*", 100);
for (String key : keysIterator) {
    logger.info(key);
}
查看更多
来,给爷笑一个
4楼-- · 2020-06-01 09:03

Try redisTemplate.setKeySerializer(new StringRedisSerializer());

查看更多
放荡不羁爱自由
5楼-- · 2020-06-01 09:06

I just consolidated the answers, we have seen here.

Here are the two ways of getting keys from Redis, when we use RedisTemplate.

1. Directly from 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);
}

Note: You should have configured redisTemplate with StringRedisSerializer in your bean

If you use java based bean configuration

redisTemplate.setDefaultSerializer(new StringRedisSerializer());

If you use spring.xml based bean configuration

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

If you don't close this connection explicitly, you will run into an exhaustion of the underlying jedis connection pool as said in https://stackoverflow.com/a/36641934/3884173.

查看更多
放荡不羁爱自由
6楼-- · 2020-06-01 09:06

I was using redisTemplate.keys(), but it was not working. So I used jedis, it worked. The following is the code that I used.

    Jedis jedis = new Jedis("localhost", 6379);
    Set<String> keys = jedis.keys("*".getBytes());
    for (String key : keys) {
        // do something
    } // for
查看更多
劫难
7楼-- · 2020-06-01 09:11

It did work, but seems not recommended? Because we can't use Keys command in production. I assume RedisTemplate.getConnectionFactory().getConnection().keys is calling redis Keys command. What are the alternatives?

查看更多
登录 后发表回答