如何在 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 包装器方面让我感到困惑。有 ScanResults
和 ScanParameter
类 流动,我不清楚如何正确使用它们。此功能的文档不存在或至少很难找到。任何人都可以指出在哪里可以找到如何使用 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
一起使用
我正在使用 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 包装器方面让我感到困惑。有 ScanResults
和 ScanParameter
类 流动,我不清楚如何正确使用它们。此功能的文档不存在或至少很难找到。任何人都可以指出在哪里可以找到如何使用 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
一起使用