Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > redis scan模糊查询

redis中数据模糊查询scan用法详解

作者:xswlw_guoquanbao

Redis模糊查询应避免KEYS,改用SCAN非阻塞迭代,优先优化键结构(如IndexSet、SortedSet),提升效率,复杂场景可结合外部搜索引擎,平衡内存、延迟及实时性需求,本文给大家介绍redis中数据模糊查询scan用法,感兴趣的朋友一起看看吧

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;
}

redis的模糊查询提高效率

Redis 中进行模糊查询(例如使用 KEYS pattern 或 SCAN cursor MATCH pattern)本质上效率是相对较低的,尤其是在大型数据集上,因为 Redis 的核心优势在于通过精确键进行 O(1) 复杂度的快速访问,而模糊查询通常需要遍历键空间。

提高 Redis 模糊查询效率的核心策略是:避免在运行时进行全键空间扫描!

以下是一些有效的方法来提高效率或规避效率瓶颈:

🛑 1. 避免使用 KEYS 命令 (最重要!)

🔍 2. 使用 SCAN 命令进行迭代式查询

原理: SCAN 命令使用游标(cursor)进行迭代,每次只返回一小部分匹配的键。它不会阻塞服务器,因为每次调用只占用少量时间。

优点:

缺点:

用法:

SCAN 0 MATCH user:profile:*:email COUNT 100

0 是起始游标(第一次调用)。

MATCH pattern 指定模糊匹配模式(可选)。

COUNT n 建议每次迭代返回的元素数量(只是个提示,Redis 可能返回更多或更少)。适当增加 COUNT (如 500, 1000) 可以在网络往返次数和单次耗时之间取得平衡,提高整体效率。

变种: SSCAN (扫描 Set), HSCAN (扫描 Hash), ZSCAN (扫描 Sorted Set)。这些用于扫描特定键内部的大集合元素,避免阻塞或大结果集。

🧠 3. 设计可查询的键结构 (最重要的优化方向!)

核心思想是将运行时扫描转化为精确查找或小范围查找。这通常需要牺牲一些存储空间(空间换时间)和增加写入/更新时的维护成本。

📦 4. 缓存模糊查询结果

🌐 5. 使用外部索引/搜索引擎 (对于复杂查询或海量数据)

📌 总结与建议

关键权衡:

选择哪种策略取决于:

务必根据你的具体应用场景进行设计和选择! 没有放之四海而皆准的最优解,但遵循“避免运行时扫描”的核心原则是关键。💪🏻

到此这篇关于redis中数据模糊查询scan用法详解的文章就介绍到这了,更多相关redis scan模糊查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文