redis 用scan扫描所有key的脚本

需求:分析redis剩下都有哪些类型的key

如果我们redis有上亿的key留存,占用很大内存,那么我们不能直接使用key * 这种形式去查看。这样在生产上面直接会把redis搞垮掉。

所以需要用到scan工具分段去扫出所有的key,然后根据key的前缀分析都是一些什么key占用的。

脚本如下:

#/bin/bash
ftmp="tmp_key.txt"
rediskeys="allkeysrediskeys.txt"
# 指定扫描的范围,下面是每次扫描10000条数据,如果你redis机器性能好的话,可以调成10w
#redis-cli -h 192.168.2.222 -a '123456'  scan 0 match "*" count 10000 |awk '{print $1}' >${ftmp}
redis-cli  -h 192.168.2.222 -a '123456' -n 1 scan 0 match "*" count 1000 |awk '{print $1}' >${ftmp}
#for i in {1..10000}
for i in {1..10}
do
        echo "第 $i 次循环:"
        # 获取point点
        point=`sed -n 1p ${ftmp}`
        echo "$point"
        sed -i '1d' ${ftmp}
        cat ${ftmp} >> ${rediskeys}
        if [ ${point} -eq 0 ];then
                echo "point=0 end scripts!"
                exit 1
        fi
        # -n 指定库名
        redis-cli -h 192.168.2.222 -a '123456' -n 1 scan ${point} match "*" count 100000 |awk '{print $1}' > ${ftmp}
        echo "redis-cli  -h 192.168.2.222 -a 123456  scan ${point} match \"*\" count 1000000 |awk '{print $1}' > ${ftmp}"
    sleep 1
done

通过上面脚本,我们得出redis所有的key写入文件:allkeysrediskeys.txt

配合awk 或者其他命令工具进行分析。比如我定义的key 格式是:业务名称:电话号码或者其他的

这样我可以通过下面命令分析:

awk -F':' '{print $1}'  allkeysrediskeys.txt | sort -n | uniq -c | sort -n

通过输出可以看到主要是哪些业务的key比较多。

上一篇:16linux三剑客题目


下一篇:如何在BASH中将制表符分隔值(TSV)文件转换为逗号分隔值(CSV)文件?(How do I convert a tab-separated values (TSV) file to a comma