2015-11-21 2 views
8

Ich benutzte Redis und jedis für ziemlich lange Zeit und brauchte nie die SCAN-Befehle bisher. Jetzt aber muss ich die Befehle verwenden, insbesondere hscan. Ich verstehe, wie es auf der Redis-Ebene funktioniert, aber die Jedis-Java-Wrapper-Seite ist für mich verwirrend. Es gibt ScanResults und ScanParameter Klassen herumfließen und ich habe kein klares Konzept, wie man sie richtig verwendet. Die Dokumentation für dieses Feature ist nicht vorhanden oder zumindest schwer zu finden. Kann jemand darauf hinweisen, wo es anständige Beispiele gibt, wie man mit hscan mit Jedis über einen Hash iterieren kann?Wie man SCAN-Befehle in Jedis verwendet

Es tut mir leid, keinen Code zu haben, aber was ich bisher probiert habe, macht überhaupt keinen Sinn.

+2

Versuchen in Jedis' Quellen suchen, speziell die Tests - sie in der Regel einen Hinweis geben: https://github.com/xetorthio/jedis/blob /master/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java#L339 –

+0

danke für diesen Zeiger. Die Tests scheinen jedoch nicht wirklich über einen Hash zu iterieren. Ich kann zum Beispiel nur einen Anruf bei hscan sehen. Mir fehlt immer noch das Konzept des aktuellen Cursors als String. – luksch

Antwort

10

In der guten Tradition der Beantwortung der Fragen, hier ist das, was habe ich herausgefunden:

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

Der wichtige Teil ist, dass Köter ein String-Variable ist, und es ist "0", wenn der Scanvorgang abgeschlossen ist.

Mit Hilfe von ScanParams war ich in der Lage, die ungefähre Größe jedes Chunks zu definieren, um aus dem Hash zu erhalten. Approximieren, da sich der Hash während des Scans ändern kann. Daher kann es sein, dass ein Element zweimal in der Schleife zurückgegeben wird.

2

Ein Vorschlag zum obigen Beispiel. Sie können die Schlüsselübereinstimmung innerhalb der scanParams-Klasse angeben. Siehe unten.

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

Ich weiß nicht wie Flag-Variablen

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));