Redis 如何在绝地中使用扫描命令

Redis 如何在绝地中使用扫描命令,redis,iteration,jedis,Redis,Iteration,Jedis,我使用redis有相当一段时间了,到目前为止,我从未需要过扫描命令。但是现在我需要使用命令,特别是hscan。我知道它在redis级别上是如何工作的,但jedis Java包装器方面让我感到困惑。有ScanResults和ScanParameter类在流动,我不清楚如何正确使用它们。此功能的文档不存在或至少很难找到。有谁能指出在哪里可以找到合适的例子,说明如何使用hscan对绝地进行哈希迭代 很抱歉没有代码,但我到目前为止所做的尝试毫无意义。按照回答自己问题的良好传统,我发现: String k

我使用redis有相当一段时间了,到目前为止,我从未需要过扫描命令。但是现在我需要使用命令,特别是hscan。我知道它在redis级别上是如何工作的,但jedis Java包装器方面让我感到困惑。有
ScanResults
ScanParameter
类在流动,我不清楚如何正确使用它们。此功能的文档不存在或至少很难找到。有谁能指出在哪里可以找到合适的例子,说明如何使用hscan对绝地进行哈希迭代


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

按照回答自己问题的良好传统,我发现:

String key=“THEKEY”;
ScanParams ScanParams=新的ScanParams().计数(100);
字符串cur=redis.clients.jedis.ScanParams.SCAN\u POINTER\u START;
boolean cycleIsFinished=false;
而(!cycleIsFinished){
扫描结果扫描结果=
绝地武士.hscan(键、cur、scanParams);
List result=scanResult.getResult();
//对结果中的键值对执行任何操作
cur=scanResult.getStringCursor();
如果(当前等于(“0”)){
cycleIsFinished=true;
}                 
}
重要的是cur是一个字符串变量,如果扫描完成,它就是
“0”


在ScanParams的帮助下,我能够定义从散列中获得的每个块的大致大小。近似值,因为哈希值可能在扫描过程中更改,因此可能是一个元素在循环中返回了两次

对上述示例的建议。可以在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;
        }
    }
ScanParams ScanParams=新的ScanParams();
scanParams.match(“*”);
字符串游标=redis.clients.jedis.ScanParams.SCAN\u指针\u开始;
boolean cycleIsFinished=false;
而(!cycleIsFinished){
ScanResult ScanResult=jedisRead.scan(光标,扫描参数);
List result=scanResult.getResult();
/*
*对结果做你需要做的事情
*/
cursor=scanResult.getStringCursor();
if(游标等于(“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));
绝地武士=新绝地武士(“本地主机”);
ScanParams ScanParams=新的ScanParams().count(10).match(“*”);
字符串cur=扫描\指针\开始;
做{
ScanResult ScanResult=jedis.scan(cur,scanParams);
//有结果地工作
scanResult.getResult().stream().forEach(System.out::println);
cur=scanResult.getStringCursor();
}而(!cur.equals(SCAN_POINTER_START));

如果您习惯于使用
java.util.Iterator
java.lang.Iterable
接口,那么您可以尝试使用基于Redis的框架

下面是一个如何迭代Redis中存储的名为“myMap”的map的所有键的示例:

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)) {
    ...
}
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)) {
    ...
}

这很简单,不是吗?

试着查找绝地武士的资料来源,特别是测试——他们通常会给出一个线索:谢谢你的指点。然而,这些测试似乎并没有真正在散列上迭代。例如,我只能看到一个对hscan的呼叫。我仍然不知道当前光标是弦的概念。他问的是绝地武士,不是雷迪森。