如何获取Redis所有现有键及其对应的最后访问时间
Redis查询所有键及对应最后访问时间方案
前置注意事项
生产环境禁止直接使用
KEYS *命令,该命令会全量遍历所有键,长时间阻塞Redis主进程,影响线上业务。键数量超过1万的场景请使用SCAN迭代的方式查询。OBJECT IDLETIME命令依赖Redis 2.2.3及以上版本支持,返回的是键距离最后一次访问的空闲秒数,最后访问Unix时间戳可通过当前时间戳 - 空闲秒数计算得到。
优先:机器可读格式输出方案
以下方案输出标准CSV格式,可直接被各类数据处理工具解析:
小数据量/测试环境方案
直接用单条命令完成输出:
redis-cli --csv KEYS '*' | xargs -L 1 -I {} sh -c 'last_access_ts=$(($(date +%s) - $(redis-cli OBJECT IDLETIME {}))); echo "{},$last_access_ts"'
输出格式示例:"user:1001",1698723456,第一列为键名,第二列为最后访问Unix时间戳(秒级)。
大数据量/生产环境方案
通过SCAN迭代查询,不会长时间阻塞Redis,配套bash脚本如下:
#!/bin/bash cursor=0 # 每次迭代拉取的键数量,可根据实际场景调整 scan_count=1000 while :; do scan_result=$(redis-cli SCAN $cursor COUNT $scan_count) cursor=$(echo "$scan_result" | head -n 1) key_list=$(echo "$scan_result" | tail -n +2 | grep -v '^$') for key in $key_list; do idle_seconds=$(redis-cli OBJECT IDLETIME "$key") last_access_ts=$(( $(date +%s) - idle_seconds )) echo "\"$key\",$last_access_ts" done [ "$cursor" = "0" ] && break done
如果使用Redis 7.0及以上版本,可直接通过SCAN的元数据返回能力一次性获取键和空闲时间,大幅降低请求开销,命令示例:
redis-cli --csv SCAN 0 RETURN 2 key idletime() | xargs -L 2 -I {} sh -c 'key=$(echo {} | cut -d, -f1); idle=$(echo {} | cut -d, -f2); last_access_ts=$(($(date +%s) - idle)); echo "$key,$last_access_ts"'
其他参考格式(人类可读)
如果需要直接查看格式化的时间,可使用以下命令输出带日期时间的结果:
redis-cli KEYS '*' | xargs -I {} sh -c 'idle=$(redis-cli OBJECT IDLETIME {}); last_access=$(date -d @$(( $(date +%s) - idle )) +"%Y-%m-%d %H:%M:%S"); echo "键名:{} 最后访问时间:$last_access"'
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

