You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:10:05