如何在 Jedis 中使用 SCAN 命令

2022-09-02 00:22:57

我使用redis和jedis已经有一段时间了,到目前为止,我从来不需要SCAN命令。但是,现在我需要使用SCAN命令,特别是hscan。我理解它在redis级别上是如何工作的,但是jedis Java包装器方面让我感到困惑。有和类流动,我对如何正确使用它们没有明确的概念。此功能的文档不存在或至少很难找到。任何人都可以指出在哪里可以找到有关如何使用hscan与jedis一起迭代哈希的体面示例?ScanResultsScanParameter

很抱歉没有代码,但到目前为止我尝试过的没有任何意义。


答案 1

在回答自己问题的良好传统中,以下是我的发现:

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

我不喜欢标志变量

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