Redis 不使用 keys 命令获取键值信息

Redis 不使用 keys 命令获取键值信息

1. 问题来源

这个问题可能看起来很奇怪,但很多 redis 集群会有一个统一的入口,入口会作兼容 redis 命令的代理,一般出于新能考虑是禁止使用 keys 命令来获取键值信息的,但是可以通过 scan 命令来代替 keys

2. 使用 keys 的方法

127.0.0.1:6379> KEYS *
1) "_kombu.binding.test_queue"
2) "a8e620b9-e52e-3498-8a1c-448f35783058"
3) "_kombu.binding.celery"

3. 使用 scan 的方法

127.0.0.1:6379> DBSIZE
(integer) 3
127.0.0.1:6379> SCAN 0 MATCH * COUNT 3
1) "5"
2) 1) "a8e620b9-e52e-3498-8a1c-448f35783058"
   2) "_kombu.binding.test_queue"
   3) "_kombu.binding.celery"

简单说明

SCAN 命令 (以及相关的 SSCAN/HSCAN/ZSCAN,分别用于 SET/HASH/ZSET) 用于增量式的遍历一个集合中的元素。因为其增量特性 (每次使用只返回一小部分元素),所以在生产环境中可以用来替代 KEYS 或 SMEMBERS 命令 (KEYS 或 SMEMBERS 命令可能会因为返回的元素过多而阻塞 redis)

所以在生产环境中即便 redis 服务支持 keys 命令,也应该用 scan 来代替

参考:
1. https://groups.google.com/forum/#!topic/redis-db/zZeI_PjHF_M
2. https://redis.io/commands/scan

Redis 中查询所有的键值对并是一次性能够完成的操作,因为 Redis 设计上倾向于高性能和低延迟响应。直接获取全部键值对可能会导致占用过多资源或造成阻塞。过我们仍然可以通过组合使用一些命令来间接达到目的。 以下是几种常见的做法: ### 方法一:遍历所有 Keys 并逐个获取 Value 这种方法是最直观但也最耗时的一种方式,尤其是在数据量较大的时候应该谨慎使用。 1. **列出所有 keys** 使用 `KEYS *` 命令可以匹配数据库中所有符合条件的键名(这里表示所有)。但是请注意,在实际应用尤其是生产环境中,应当避免频繁调用此命令,因为它会对性能产生较大影响。 ```bash KEYS * ``` 2. **迭代取出每个 Key 对应的 Value** 将上述得到的结果保存下来,再循环地去获取每一个键的具体内容,比如可以用如下的形式在一个脚本里处理: ```bash for key in $(redis-cli --raw KEYS "*"); do echo "$key -> $(redis-cli get $key)"; done ``` 上述示例适用于 Linux Shell 环境下执行 bash 脚本;对于 Windows 用户来说,则需转换成 PowerShell 语法或者借助其他语言编写相应程序。 ### 方法二:利用 SCAN 实现更高效的非阻塞性搜索 SCAN 及其家族成员(SSCAN、HSCAN 和 ZSCAN)提供了一种渐进式的方式逐步探索数据集而会锁定整个数据库。它们非常适合用于开发调试工具或其他需要安全高效枚举元素的应用场景。 ```bash # 开始一次新的扫描过程,cursor 初始化为0 scan_cursor=0 while true; do # 执行 scan 操作,并解析返回结果中的新游标位置及一批键名 read new_scan_cursor keys <<<$(redis-cli SCAN ${scan_cursor}) if [ "${new_scan_cursor}" == "0" ]; then break ; fi scan_cursor=${new_scan_cursor} # 输出当前批次的所有键及其对应value for k in ${keys};do echo -n "${k} => "; redis-cli GET ${k};done; done ``` 这段代码展示了如何通过反复调用 SCAN 来遍历所有键,并打印每一对键值。 需要注意的是,由于Redis支持多种类型的值(字符串、哈希表、列表等等),所以如果你遇到是简单字符串类型的数据结构时(例如 list, set, hash 等),可能还需要结合相应的命令(LPUSH/RPOP, HGETALL 等)来完整展示其内部信息。 --- 为了提高效率并且对系统造成太大压力,请尽可能选择第二种基于 SCAN 的方案。此外,在线上业务中建议仅限于测试用途或小规模部署时尝试此类全量查询动作。 --
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值