如何在 Jedis 中使用 SCAN 命令

How to use SCAN commands in Jedis

我正在使用 redis 和 jedis for quite some time and never needed the SCAN commands so far. Now however I need to use the SCAN 命令,尤其是 hscan。我了解它在 redis 级别上的工作原理,但 jedis Java 包装器方面让我感到困惑。有 ScanResultsScanParameter 类 流动,我不清楚如何正确使用它们。此功能的文档不存在或至少很难找到。任何人都可以指出在哪里可以找到如何使用 hscan 和 jedis 迭代散列的好例子吗?

很抱歉没有代码,但我到目前为止所做的一切都毫无意义。

本着回答自己问题的优良传统,以下是我的发现:

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 的帮助下,我能够定义从哈希中获取的每个块的大致大小。近似的,因为hash在扫描过程中可能会发生变化,所以可能是一个元素在循环中被返回了两次。

对上面例子的一个建议。您可以在 scanParams class 中指定键匹配。见下文。

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

我不喜欢标志变量

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

(派对迟到了,我知道) 我是位于 github.

的库 InterruptingJedisLocks 的开发者

我的 class ScanIterable/ScanIterator 是在底层使用 SCAN 操作的迭代器;使其在 Java 中更容易操作,隐藏了复杂性。 ScanUtilsclass也是个好帮手

随意将其与库一起使用,或者仅与 Java classes

一起使用