我一直用這個問題困住了很長時間。我想使用redis模板從redis獲取密鑰。 我試過this.redistemplate.keys(「*」); 但這並沒有獲取任何東西。即使使用該模式,它也不起作用。如何使用redis模板從Redis獲取所有密鑰
您能否就此建議最佳解決方案?
我一直用這個問題困住了很長時間。我想使用redis模板從redis獲取密鑰。 我試過this.redistemplate.keys(「*」); 但這並沒有獲取任何東西。即使使用該模式,它也不起作用。如何使用redis模板從Redis獲取所有密鑰
您能否就此建議最佳解決方案?
嘗試:
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));
}
嘗試redisTemplate.setKeySerializer(new StringRedisSerializer());
它沒有工作,但似乎不建議?因爲我們無法在生產中使用Keys命令。我假設RedisTemplate.getConnectionFactory().getConnection().keys
正在調用redis Keys命令。有什麼選擇?
解決方案可以是這樣的
String pattern = "abc"+"*";
Set<String> keys = jedis.keys(pattern);
for (String key : keys) {
jedis.keys(key);
}
或者你可以使用jedis.hscan()
和ScanParams
代替。
我剛剛鞏固了答案,我們在這裏看到了。
當我們使用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中所述。
我正在使用redisTemplate.keys()
,但它不工作。所以我用jedis,它工作。以下是我使用的代碼。
Jedis jedis = new Jedis("localhost", 6379);
Set<String> keys = jedis.keys("*".getBytes());
for (String key : keys) {
// do something
} // for
這幫了我很多,值得更多upvotes! – varunkr
這應該是被接受的答案。 –