简介
我们知道,在redis中,如果以及有非常多的key,那么执行keys *会阻塞redis很长时间,在生产环境是非常危险的。但是如果我们一定要批量扫描redis,那么可以使用redis提供的scan命令。
scan 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。这一点有点像Elasticsearch的scoll
查询。
SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。
相关命令:
- SSCAN命令用于迭代集合键中的元素。
- HSCAN命令用于迭代哈希键中的键值对。
- ZSCAN命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
语法
redis Scan 命令基本语法如下:
SCAN cursor [MATCH pattern] [COUNT count]
- cursor - 游标。
- pattern - 匹配的模式。
- count - 指定从数据集里返回多少元素,默认值为 10 。
演示
我这里放了36个key在redis中:
执行:
Spring Data Redis实现scan
代码:
@Autowired
Redistemplate<String, Object> redistemplate;
@Test
public void testScan(){
Set<Object> execute = redistemplate.execute((RedisCallback<Set<Object>>) connection -> {
Set<Object> binaryKeys = new HashSet<>();
Cursor<byte[]> cursor = connection.scan(new Scanoptions.ScanoptionsBuilder().match("*").count(10).build());
while (cursor.hasNext()) {
binaryKeys.add(new String(cursor.next()));
}
return binaryKeys;
});
execute.forEach(System.out::println);
}
运行结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。