2013-09-30 283 views
7

我一直用这个问题困住了很长时间。我想使用redis模板从redis获取密钥。 我试过this.redistemplate.keys(“*”); 但这并没有获取任何东西。即使使用该模式,它也不起作用。如何使用redis模板从Redis获取所有密钥

您能否就此建议最佳解决方案?

回答

8

尝试:

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

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

0

它没有工作,但似乎不建议?因为我们无法在生产中使用Keys命令。我假设RedisTemplate.getConnectionFactory().getConnection().keys正在调用redis Keys命令。有什么选择?

0

解决方案可以是这样的

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

或者你可以使用jedis.hscan()ScanParams代替。

11

我刚刚巩固了答案,我们在这里看到了。

当我们使用RedisTemplate时,以下是从Redis获取密钥的两种方法。

从RedisTemplate 1.直接

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

配置redisTemplate StringRedisSerializer如果您使用基于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中所述。

+0

这帮了我很多,值得更多upvotes! – varunkr

+0

这应该是被接受的答案。 –

0

我正在使用redisTemplate.keys(),但它不工作。所以我用jedis,它工作。以下是我使用的代码。

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