2015-11-21 11 views
8

Przez jakiś czas używałem redis i jedis i do tej pory nie potrzebowałem poleceń SCAN. Teraz jednak potrzebuję użyć poleceń SCAN, szczególnie hscan. Rozumiem, jak to działa na poziomie redis, ale strona jajeczna Java jest dla mnie myląca. Wokół krążą klasy ScanResults i ScanParameter i nie mam jasnego pojęcia, jak prawidłowo ich używać. Dokumentacja tej funkcji jest nieistniejąca lub co najmniej trudna do znalezienia. Czy ktoś może wskazać, gdzie znaleźć godne przykłady, jak iterować na haszyszu przy użyciu hscan z jedis?Jak używać poleceń SCAN w Jedis?

Przepraszam, że nie mam kodu, ale to, co próbowałem do tej pory, nie ma żadnego sensu.

+2

Spróbuj poszukać w źródłach Jedis', a konkretnie testy - są zazwyczaj dać wskazówkę: https://github.com/xetorthio/jedis/blob /master/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java#L339 –

+0

Dziękuję za ten wskaźnik. Jednak testy nie wydają się naprawdę iterować nad hashem. Widzę tylko jedno połączenie do hscan na przykład. Wciąż brakuje mi koncepcji bieżącego kursora jako String. – luksch

Odpowiedz

10

W dobrej tradycji odpowiadając na własne pytania, oto co się dowiedziałem:

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

Ważne jest to, że bież jest zmienną String i jest "0" jeśli zakończeniu skanowania.

Za pomocą programu ScanParams udało mi się określić przybliżony rozmiar każdego fragmentu, aby uzyskać jego wartość. Przybliżony, ponieważ wartość skrótu może się zmienić podczas skanowania, więc może się zdarzyć, że element zostanie zwrócony dwukrotnie w pętli.

2

Sugestia do powyższego przykładu. Możesz określić dopasowanie klucza w klasie scanParams. Zobacz poniżej.

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

nie lubię zmienne flag

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)); 
Powiązane problemy