13

我已经被这个问题困扰了很长一段时间。我想使用 redis 模板从 redis 获取密钥。我试过 this.redistemplate.keys("*"); 但这并没有得到任何东西。即使有模式,它也不起作用。

你能告诉我什么是最好的解决方案。

4

8 回答 8

23

我只是合并了我们在这里看到的答案。

当我们使用 RedisTemplate 时,这里有两种从 Redis 获取密钥的方法。

1.直接来自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);
}

注意:您应该在 bean 中使用StringRedisSerializer配置 redisTemplate

如果您使用基于 java 的 bean 配置

redisTemplate.setDefaultSerializer(new StringRedisSerializer());

如果您使用基于 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.来自 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();

如果您不明确关闭此连接,您将遇到底层 jedis 连接池的耗尽,如https://stackoverflow.com/a/36641934/3884173中所述。

于 2016-08-19T06:17:13.333 回答
11

尝试:

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));
}
于 2014-02-04T09:39:53.113 回答
4

尝试redisTemplate.setKeySerializer(new StringRedisSerializer());

于 2015-02-18T17:15:36.063 回答
2

避免使用keys命令。当它针对大型数据库执行时,它可能会破坏性能。

您应该改用scan命令。您可以这样做:

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.
}

或者使用Redisson Redis Java 客户端更简单:

Iterable<String> keysIterator = redisson.getKeys().getKeysByPattern("test*", 100);
for (String key : keysIterator) {
    logger.info(key);
}
于 2020-03-22T07:10:12.863 回答
1

我正在使用redisTemplate.keys(),但它不起作用。所以我使用了绝地武士,它奏效了。以下是我使用的代码。

    Jedis jedis = new Jedis("localhost", 6379);
    Set<String> keys = jedis.keys("*".getBytes());
    for (String key : keys) {
        // do something
    } // for
于 2017-01-03T08:48:38.313 回答
1

它确实有效,但似乎不推荐?因为我们不能在生产中使用 Keys 命令。我假设RedisTemplate.getConnectionFactory().getConnection().keys正在调用 redis Keys 命令。有哪些替代方案?

于 2016-02-22T06:19:39.650 回答
0

解决方案可以是这样的

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

或者您可以使用jedis.hscan()andScanParams代替。

于 2016-08-09T08:58:08.687 回答
0

尝试

import org.springframework.data.redis.core.RedisTemplate;
import org.apache.commons.collections.CollectionUtils;

String key = "example*";
Set keys = redisTemplate.keys(key); 
if (CollectionUtils.isEmpty(keys)) return null;
List list = redisTemplate.opsForValue().multiGet(keys);
于 2021-03-04T04:21:57.910 回答