2015-11-21 18 views
8

Tôi đã sử dụng redis và jedis trong một thời gian khá dài và không bao giờ cần lệnh SCAN cho đến nay. Bây giờ tuy nhiên tôi cần phải sử dụng các lệnh SCAN, đặc biệt là hscan. Tôi hiểu cách nó hoạt động trên cấp độ redis, nhưng jedis Java wrapper side là khó hiểu với tôi. Có ScanResultsScanParameter lớp học chạy quanh và tôi không có khái niệm rõ ràng về cách sử dụng chúng đúng cách. Tài liệu cho tính năng này không tồn tại hoặc ít nhất là khó tìm. Bất cứ ai có thể chỉ ra nơi để tìm các ví dụ phong nha về làm thế nào để lặp qua một băm bằng cách sử dụng hscan với jedis?Cách sử dụng lệnh QUÉT trong Jedis

Xin lỗi vì không có mã, nhưng những gì tôi đã thử cho đến nay chỉ không có ý nghĩa gì.

+2

Hãy thử tìm kiếm trong các nguồn Jedis', đặc biệt là kiểm tra - họ thường cung cấp cho một đầu mối: https://github.com/xetorthio/jedis/blob /master/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java#L339 –

+0

cảm ơn bạn về con trỏ đó. Tuy nhiên, các thử nghiệm dường như không thực sự lặp qua một băm. Tôi chỉ có thể thấy một cuộc gọi đến hscan chẳng hạn. Tôi vẫn còn thiếu khái niệm về con trỏ hiện tại dưới dạng Chuỗi. – luksch

Trả lời

10

Trong truyền thống tốt đẹp của việc trả lời câu hỏi của riêng, đây là những gì tôi phát hiện ra:

key = "THEKEY"; 
ScanParams scanParams = new ScanParams().count(100); 
String cur = redis.clients.jedis.ScanParams.SCAN_POINTER_START; 
boolean cycleIsFinished = false; 
while(!cycleIsFinished){ 
    ScanResult<Entry<String, String>> scanResult = 
     jedis.hscan(key, cur, scanParams); 
    List<Entry<String, String>> result = scanResult.getResult(); 

    //do whatever with the key-value pairs in result 

    cur = scanResult.getStringCursor(); 
    if (cur.equals("0")){ 
    cycleIsFinished = true; 
    }     
} 

Phần quan trọng là cur là một biến String và nó là "0" nếu quá trình quét hoàn tất.

Với sự trợ giúp của ScanParams, tôi có thể xác định kích thước gần đúng của từng đoạn để lấy từ băm. Gần đúng, vì băm có thể thay đổi trong quá trình quét, do đó có thể một phần tử được trả về hai lần trong vòng lặp.

2

Đề xuất cho ví dụ ở trên. Bạn có thể chỉ định khớp chính trong lớp scanParams. Xem bên dưới.

ScanParams scanParams = new ScanParams(); 
    scanParams.match("*"); 

    String cursor = redis.clients.jedis.ScanParams.SCAN_POINTER_START; 
    boolean cycleIsFinished = false; 
    while (!cycleIsFinished) { 

     ScanResult<String> scanResult = jedisRead.scan(cursor, scanParams); 
     List<String> result = scanResult.getResult(); 

     /* 
     * do what you need to do with the result 
     */ 



     cursor = scanResult.getStringCursor(); 
     if (cursor.equals("0")) { 
      cycleIsFinished = true; 
     } 
    } 
5

tôi không thích biến cờ

Jedis jedis = new Jedis("localhost"); 

ScanParams scanParams = new ScanParams().count(10).match("*"); 
String cur = SCAN_POINTER_START; 
do { 
    ScanResult<String> scanResult = jedis.scan(cur, scanParams); 

    // work with result 
    scanResult.getResult().stream().forEach(System.out::println); 
    cur = scanResult.getStringCursor(); 
} while (!cur.equals(SCAN_POINTER_START)); 
Các vấn đề liên quan