redis中数据模糊查找-scan用法

1.查找方法

Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,

一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行的,keys是以遍历的方式实现的复杂度是 O(n),Redis库中的key越多,查找实现代价越大,产生的阻塞时间越长。

二是scan命令,以非阻塞的方式实现key值的查找,绝大多数情况下是可以替代keys命令的,可选性更强

2.keys命令

复制代码
127.0.0.1:6379> keys s*
1) "s1"
2) "sddddf"
3) "sss"
4) "s358"
127.0.0.1:6379> 

3.scan命令

复制代码
SCAN cursor [MATCH pattern] [COUNT count] 
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
可用版本
>= 2.8.0

示例:

复制代码
127.0.0.1:6379> keys s*
1) "s1"
2) "sddddf"
3) "sss"
4) "s358"
127.0.0.1:6379> scan 0 match s* count 20
1) "0"
2) 1) "s1"
   2) "sss"
   3) "s358"
   4) "sddddf"
127.0.0.1:6379> scan 0 match s* count 2
1) "4"
2) 1) "s1"
127.0.0.1:6379> scan 4 match s* count 2
1) "1"
2) 1) "sss"
   2) "s358"
127.0.0.1:6379> scan 1 match s* count 2
1) "3"
2) 1) "sddddf"

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

4.Java代码中的实现

复制代码
public Set<String> scan(String matchKey) {
    Set<String> keys = redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
        Set<String> keysTmp = new HashSet<>();
        Cursor<byte[]> cursor = connection.scan(
                new ScanOptions.ScanOptionsBuilder().match("*" + matchKey + "*").count(1000).build()
        );
        while (cursor.hasNext()) {
            keysTmp.add(new String(cursor.next()));
        }
        return keysTmp;
    });

    return keys;
}
相关推荐
MegaDataFlowers几秒前
认识O(NlogN)的排序
java·开发语言·排序算法
蘑菇小白5 分钟前
基于嵌入式的数据库SQLite
linux·数据库·sqlite
梨落秋霜8 分钟前
Python入门篇【连接数据库】
数据库·python·oracle
w1225h9 分钟前
【SpringBoot】Spring Boot 项目的打包配置
java·spring boot·后端
李少兄9 分钟前
解析 IntelliJ IDEA “Immutable object is modified”警告
java·ide·intellij-idea
客卿12310 分钟前
二叉树的层序遍历--思路===bfs的应用,以及java中队列的方法实操
java·算法·宽度优先
健康平安的活着11 分钟前
java中事务@Transaction的正确使用和触发回滚机制【经典】
java·开发语言
Han.miracle13 分钟前
IntelliJ IDEA 高效开发实用技巧
java·ide·intellij-idea
Barkamin15 分钟前
使用PriorityQueue创建大小堆,解决TOPK问题
java·开发语言
gaozhiyong081315 分钟前
【Spring Boot】 SpringBoot自动装配-Condition
java·spring boot·后端