web-dev-qa-db-ja.com

JedisでSCANコマンドを使用する方法

私はかなり長い間redisと jedis を使用しており、これまでSCANコマンドを必要としていませんでした。しかし今は [〜#〜] scan [〜#〜] コマンド、特にhscanを使用する必要があります。私はそれがredisレベルでどのように機能するかを理解していますが、jedis Javaラッパー側は私を混乱させています。ScanResultsおよびScanParameterクラスが流れており、私はそれらを適切に使用する方法の明確な概念がありません。この機能のドキュメントは存在しないか、少なくとも見つけるのが困難です。hdisをjedisで使用してハッシュを反復する方法の適切な例を見つける場所を誰かが指摘できますか?

コードがなくて申し訳ありませんが、これまでに試したものはまったく意味がありません。

18
luksch

自分の質問に答えるという伝統の中で、私が見つけたものは次のとおりです。

String 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は文字列変数であり、"0"スキャンが完了した場合。

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

23
luksch

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

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

上記の例への提案。 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;
        }
    }
3
Onno Becker Hof

慣れている場合はJava.util.IteratorまたはJava.lang.Iterableインターフェースを使用すると、Redisベースのフレームワーク Redisson を試すことができます。

Redisに保存されている「myMap」という名前のマップのすべてのkeysを反復する方法の例を次に示します。

RedissonClient redissonClient = RedissonClient.create(config);

// implements Java.util.concurrent.ConcurrentMap interface
RMap<String, String> map = redissonClient.getMap("myMap");

// default batch size on each HSCAN invocation is 10
for (String key: map.keySet()) {
    ...
}

// default batch size on each HSCAN invocation is 250
for (String key: map.keySet(250)) {
    ...
}

Redisに保存されているすべてのkeysを反復する方法の例を次に示します。

RedissonClient redissonClient = RedissonClient.create(config);

RKeys keys = redissonClient.getKeys();

// default batch size on each SCAN invocation is 10
for (String key: keys.getKeys()) {
    ...
}

// default batch size on each SCAN invocation is 250
for (String key: keys.getKeys(250)) {
    ...
}

とても簡単ですね。

1