How to get all Keys from Redis using redis template

后端 未结 7 1167
误落风尘
误落风尘 2020-12-31 06:30

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

相关标签:
7条回答
  • 2020-12-31 06:52

    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?

    0 讨论(0)
  • 2020-12-31 07:00

    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);
    }
    
    0 讨论(0)
  • 2020-12-31 07:01

    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
    
    0 讨论(0)
  • 2020-12-31 07:06

    Solution can be like this

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

    Or you can use jedis.hscan() and ScanParams instead.

    0 讨论(0)
  • 2020-12-31 07:07

    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.

    0 讨论(0)
  • 2020-12-31 07:08

    Try redisTemplate.setKeySerializer(new StringRedisSerializer());

    0 讨论(0)
提交回复
热议问题