需求:分析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比较多。