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