2015-11-21 20 views
8

私はredisとjedisを使っていましたが、それまでのところSCANコマンドは必要ありませんでした。しかし、私はSCANコマンド、特にhscanを使う必要があります。私はredisレベルでどのように動作するのか理解していますが、jedis Javaラッパー側が私に混乱しています。 ScanResultsScanParameterのクラスが流れています。私はそれらを適切に使用する明確な概念がありません。この機能のドキュメントは存在しないか、少なくとも見つけにくいです。誰でもjedisを使ってhscanを使ってハッシュを反復する方法の良い例をどこから見つけることができますか?JedisでSCANコマンドを使用する方法

申し訳ありませんがコードはありませんが、これまでに試したことはまったく意味がありません。ここでは、自分の質問に答えるのは良い伝統で

+2

、Jedis'ソースに特異的にテストを探して試してみてください - 彼らは通常の手掛かりを与える:https://github.com/xetorthio/jedis/blobを/master/src/test/java/redis/clients/jedis/tests/commands/HashesCommandsTest.java#L339 –

+0

そのポインタをありがとう。しかし、テストは実際にはハッシュを反復するようには見えません。たとえば、hscanを1回だけ呼び出すことができます。私はまだ文字列として現在のカーソルの概念が欠けています。 – luksch

答えて

10

は、私が見つけたものです:

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

重要な部分は、curがString型の変数で、スキャンが完了している場合、それは"0"であるということです。

ScanParamsの助けを借りて、私は各チャンクのおおよそのサイズをハッシュから取得することができました。スキャン中にハッシュが変わる可能性があるため、ループ内で要素が2回返される可能性があります。

2

上記の例の提案。 scanParamsクラス内でキーの一致を指定できます。下記参照。

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

私は好きではないフラグ変数

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)); 
関連する問題