在 Redis 中查看所有 key 而不阻塞服务是一个常见需求,因为 KEYS *
命令在生产环境中可能会造成性能问题。以下是几种安全的方法:
SCAN
是 Redis 提供的非阻塞式迭代器,可以安全地在生产环境中使用:
# 基本用法
redis-cli SCAN 0
# 带匹配模式的扫描
redis-cli SCAN 0 MATCH "prefix:*"
# 设置每次返回的数量(不保证精确)
redis-cli SCAN 0 COUNT 1000
SCAN
命令特点:
- 不会阻塞 Redis 服务器
- 每次调用返回一个游标和部分结果
- 需要多次调用直到游标返回0
- 可能会返回重复的key,需要在客户端去重
如果只需要监控 key 的变化而不是一次性获取所有 key,可以配置 keyspace 通知。
redis-cli --bigkeys
这个命令会扫描 key 空间但比 KEYS *
更温和。
可以:
1. 执行 BGSAVE
创建 RDB 快照
2. 使用 redis-rdb-tools
等工具分析 RDB 文件
#!/bin/bash
cursor=0
keys=""
while true; do
# 使用SCAN命令,每次返回1000个key
reply=$(redis-cli SCAN $cursor COUNT 1000)
# 解析返回结果
cursor=$(echo "$reply" | head -n 1)
newkeys=$(echo "$reply" | tail -n +2)
keys="$keys $newkeys"
# 当游标为0时结束
if [[ $cursor -eq 0 ]]; then
break
fi
done
echo "所有key:"
echo $keys | tr ' ' '\n' | sort | uniq
以上方法可以帮助您在不阻塞 Redis 服务的情况下安全地查看 key。