我使用redis和jedis已经有一段时间了,到目前为止从未需要SCAN命令。但是现在我需要使用SCAN命令,特别是hscan。我理解它在redis级别上是如何工作的,但jedis Java包装器方面让我感到困惑。有ScanResults
和ScanParameter
类流动,我没有明确的如何正确使用它们的概念。此功能的文档不存在或至少很难找到。任何人都可以指出在哪里可以找到如何使用hscan使用jedis迭代哈希的正确示例?
很抱歉没有代码,但到目前为止我所尝试的内容毫无意义。
答案 0 :(得分:10)
我不喜欢标志变量
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));
答案 1 :(得分:3)
对上述示例的建议。您可以在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;
}
}
答案 2 :(得分:1)
如果您习惯使用<body>
<div id="bodyContent">
<select id="unitSelect" onchange="switchUnits()">
<option value="default">Default</option>
<option value="metric">Metric</option>
<option value="imperial">Imperial</option>
</select>
<ul>
<li class="convertable-length">100 feet</li>
<li class="convertable-length">100 meters</li>
</ul>
</div>
</body>
或java.util.Iterator
接口,则可以尝试使用基于Redis的框架Redisson。
下面是一个示例,该示例如何迭代Redis中存储的名称为“ myMap”的地图的所有键:
java.lang.Iterable
下面是一个示例,说明如何迭代Redis中存储的所有键:
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)) {
...
}
不是很简单吗?