2013-09-30 14 views
7

Tôi đã gặp vấn đề này với thời gian khá dài. Tôi muốn lấy các khóa từ redis bằng mẫu redis. Tôi đã thử this.redistemplate.keys ("*"); nhưng điều này không tìm nạp bất kỳ thứ gì. Ngay cả với các mô hình nó không hoạt động.Cách lấy tất cả các Phím từ Redis bằng mẫu redis

Bạn có thể vui lòng tư vấn về giải pháp tốt nhất cho điều này không.

Trả lời

8

thử:

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

Hãy thử redisTemplate.setKeySerializer(new StringRedisSerializer());

0

Nó đã làm việc, nhưng dường như không được khuyến khích? Bởi vì chúng ta không thể sử dụng lệnh Keys trong sản xuất. Tôi giả sử RedisTemplate.getConnectionFactory().getConnection().keys đang gọi lệnh Redis Keys. Các lựa chọn thay thế là gì?

0

Giải pháp có thể như thế này

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

Hoặc bạn có thể sử dụng jedis.hscan()ScanParams để thay thế.

11

Tôi vừa tổng hợp các câu trả lời, chúng tôi đã thấy ở đây.

Dưới đây là hai cách để nhận khóa từ Redis, khi chúng tôi sử dụng RedisTemplate.

1. Trực tiếp từ 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); 
} 

Lưu ý: Bạn nên đã cấu hình redisTemplate với StringRedisSerializer trong đậu

của bạn Nếu bạn sử dụng java dựa cấu hình đậu

redisTemplate.setDefaultSerializer(new StringRedisSerializer()); 

Nếu bạn sử dụng spring.xml dựa cấu hình đậu

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

Nếu bạn không đóng kết nối này một cách rõ ràng, bạn sẽ chạy vào một kiệt sức của hồ bơi kết nối jedis cơ bản như đã nói trong https://stackoverflow.com/a/36641934/3884173.

+0

Điều này đã giúp tôi rất nhiều, xứng đáng nhận được nhiều ưu điểm hơn !! – varunkr

+0

Đây phải là câu trả lời được chấp nhận. –

0

Tôi đã sử dụng redisTemplate.keys(), nhưng nó không hoạt động. Vì vậy, tôi đã sử dụng jedis, nó hoạt động. Sau đây là mã mà tôi đã sử dụng.

Jedis jedis = new Jedis("localhost", 6379); 
    Set<String> keys = jedis.keys("*".getBytes()); 
    for (String key : keys) { 
     // do something 
    } // for 
Các vấn đề liên quan