Redis模糊查询Key技巧,轻松定位数据,提升工作效率,让数据管理更高效

文章导读
Redis模糊查询Key技巧就是使用KEYS或SCAN命令配合通配符来快速找到匹配的键,无需记住完整键名。
📋 目录
  1. Redis模糊查询Key技巧,轻松定位数据,提升工作效率,让数据管理更高效
  2. 为什么需要模糊查询
  3. 两个核心命令:KEYS和SCAN
  4. 通配符怎么用
  5. 实际工作中怎么用
  6. 需要注意的地方
  7. 提升效率的小技巧
  8. FAQ
A A

Redis模糊查询Key技巧,轻松定位数据,提升工作效率,让数据管理更高效

Redis模糊查询Key技巧就是使用KEYS或SCAN命令配合通配符来快速找到匹配的键,无需记住完整键名。

为什么需要模糊查询

平时工作中,我们常会遇到这样的情况:系统里存了大量数据,键名可能很长或者有特定格式,比如“user:123:profile”、“order:20231015:001”。时间一久,你很难记住所有键的完整名字。特别是线上排查问题或清理旧数据时,如果能快速找出所有类似“user:*”或“*20231015*”的键,效率就会大大提升。如果一个个去试或者去代码里翻找,不仅费时,还容易出错。

两个核心命令:KEYS和SCAN

Redis提供了两个主要命令来进行模糊查询。第一个是KEYS命令。它的用法很简单,直接在后面加上带通配符的模式就行。比如,你想找所有以“user:”开头的键,就输入“KEYS user:*”。这里的星号(*)表示匹配任意多个字符。问号(?)则用来匹配单个字符,比如“KEYS user:1??”可以匹配像“user:123”这样的键。这个命令在测试环境或数据量不大的时候非常方便,一输完结果立刻就出来了。

但KEYS命令有个明显的缺点:它会一次性遍历所有键。如果你的Redis里存了几百万甚至上千万个键,执行这个命令可能会让服务器卡住一会儿,影响其他操作。所以,在生产环境,尤其是数据量大的情况下,不建议直接使用KEYS。

这时候,第二个命令SCAN就派上用场了。SCAN的设计更聪明,它不会一次性把活干完,而是分批进行。你第一次执行“SCAN 0 MATCH user:*”,它会返回一部分结果和一个新的游标(比如12345)。然后你用这个新游标接着执行“SCAN 12345 MATCH user:*”,它再返回下一批。这样一点点来,直到游标变回0,表示全部查完了。整个过程服务器压力小,不会阻塞,适合在生产环境使用。虽然看起来步骤多了点,但为了系统稳定,这是值得的。

通配符怎么用

无论用KEYS还是SCAN,都离不开通配符。星号(*)是最常用的,它可以放在开头、中间或结尾。比如“*session”找所有以“session”结尾的键;“order*2023*”找键名中包含“order”和“2023”的键,不管它们中间隔了什么。问号(?)用来占一个字符的位置,比如“log:2023101?”可以匹配“log:20231010”到“log:20231019”。中括号([])用得少一些,可以指定一个字符范围,比如“data:[abc]*”匹配以“data:a”、“data:b”或“data:c”开头的键。掌握这几个符号,大部分查找需求都能满足。

实际工作中怎么用

知道了命令,还得知道用在哪儿。最常见的就是数据清理。比如,系统里每天都会生成一些临时数据,键名像“cache:temp:20231015:xxx”。周末你想清理一周前的,可以先“SCAN 0 MATCH cache:temp:*”看看有哪些,确认无误后,再写个小脚本用DEL命令删掉。排查问题也经常用。用户反馈某个功能异常,你怀疑是某个缓存没更新,可以快速查一下相关键的状态。比如“KEYS product:detail:*”看看商品详情缓存是不是都正常。

这里分享一个经验:模糊查询的结果最好先核对一下,特别是准备删除前。你可以把SCAN的结果先存到一个文件里,或者用COUNT参数控制每次返回的数量(如“SCAN 0 MATCH user:* COUNT 100”),慢慢处理,避免误操作。

Redis模糊查询Key技巧,轻松定位数据,提升工作效率,让数据管理更高效

需要注意的地方

使用模糊查询时,有几点要留心。第一,生产环境慎用KEYS。这点前面强调了,因为它可能导致服务暂时无响应。如果非要用,最好在业务低峰期,并且提前告知团队。第二,模式别写得太宽泛。“KEYS *”这种会列出所有键,和用KEYS没区别,同样有风险。尽量把模式写得具体点,比如用“user:active:*”而不是“user:*”,减少扫描范围。第三,SCAN命令在迭代过程中,如果数据有变动(比如新增或删除了键),可能会看到重复的键或少量的键没被扫描到,这是正常现象。对于数据清理等操作,一般影响不大。

提升效率的小技巧

想要更快更省事,可以试试这些方法。一是结合管道(pipeline)使用。如果你用编程语言(比如Python、Java)操作Redis,可以先用SCAN查出所有匹配的键名,然后通过管道一次性发送DEL命令删除,这比一个个删快很多。二是善用别名或工具。有些Redis客户端管理工具(像RedisInsight、Another Redis Desktop Manager)提供了图形化的模糊查找功能,点点鼠标就能操作,对不熟悉命令的人很友好。三是做好键的命名规范。从一开始就把键名设计得有条理,比如用冒号分隔层次“业务:子业务:ID”,这样查找时模式更清晰,也更容易管理。

FAQ

问:KEYS和SCAN命令,哪个更好?
答:没有绝对的好坏,看场景。KEYS简单直接,结果立即返回,适合数据量小的测试或开发环境。SCAN分批处理,不阻塞服务器,适合数据量大的生产环境。安全起见,生产环境推荐用SCAN。

问:模糊查询会影响Redis的性能吗?
答:会的,但程度不同。KEYS命令如果扫描大量键,可能会暂时消耗较多CPU并阻塞其他请求。SCAN命令是增量式的,每次只扫描一小部分,对性能影响很小,几乎感觉不到。但即便如此,也不建议过于频繁地执行模糊查询。

问:除了KEYS和SCAN,还有其他查找键的方法吗?
答:有。比如,如果你知道键的大概数量,可以用INFO命令查看“keyspace”信息,了解各个数据库的键数。或者,使用一些第三方监控工具,它们可以提供更丰富的键查询和统计功能。但基本的模糊查找,KEYS和SCAN是最常用和核心的。

参考来源:Redis官方文档关于KEYS和SCAN命令的说明(https://redis.io/commands/keys/, https://redis.io/commands/scan/),以及常见的Redis运维实践。