Redis:如何通过SCAN命令获取匹配模式的键的数量?
统计Redis中匹配指定模式的键总数
背景
我需要统计匹配tick:klays:umc:*模式的Redis键总数,目前通过SCAN 0 MATCH tick:klays:umc:*能拿到符合条件的键数组,但只需要总数。日常会用INCR操作这类键,示例:
INCR tick:klays:umc:278 INCR tick:klays:umc:260 INCR tick:klays:umc:279
可行方案
1. 循环SCAN累加计数
SCAN是分批返回结果的,单次调用无法获取全部匹配键,必须循环执行直到游标归0,每次累加返回的键数量。以下是Shell脚本实现:
count=0 cursor=0 while true; do # 执行SCAN命令,COUNT设为1000提升扫描效率 result=$(redis-cli SCAN $cursor MATCH tick:klays:umc:* COUNT 1000) # 提取游标值 cursor=$(echo "$result" | awk '{print $1}') # 提取本次返回的键列表 keys=$(echo "$result" | awk '{$1=""; print $0}') # 计算本次返回的键数量并累加 current_count=$(echo "$keys" | wc -w) count=$((count + current_count)) # 游标为0时结束循环 [ "$cursor" -eq 0 ] && break done echo "匹配键总数:$count"
2. Lua脚本原子统计
如果需要避免统计过程中键的增减(比如INCR操作)影响结果,用Lua脚本可以实现原子性的扫描计数:
local cursor = 0 local total = 0 repeat local scan_result = redis.call('SCAN', cursor, 'MATCH', 'tick:klays:umc:*', 'COUNT', 1000) cursor = tonumber(scan_result[1]) total = total + #scan_result[2] until cursor == 0 return total
执行脚本的命令:
redis-cli EVAL "local cursor = 0 local total = 0 repeat local scan_result = redis.call('SCAN', cursor, 'MATCH', 'tick:klays:umc:*', 'COUNT', 1000) cursor = tonumber(scan_result[1]) total = total + #scan_result[2] until cursor == 0 return total" 0
注意点
COUNT参数是Redis的优化提示,实际返回的键数可能浮动,建议设为1000左右平衡扫描效率和资源占用。- 生产环境绝对不要用
KEYS tick:klays:umc:*,这个命令会阻塞Redis实例,影响所有业务操作,SCAN是渐进式的,不会阻塞。
内容的提问来源于stack exchange,提问作者yong ho
相关产品推荐
相关产品推荐

