Redis存储优化

bigkeys 扫描

/redis-cli -h localhost -p 6379 --bigkeys

全量扫描

通过以下脚本扫描 Redis中的全量Keys, Keys存量较大的情况下,可以分多次优化处理。
比如:keys.txt文件收集到100MB时,停止,先优化一部分;优化完,再扫描,再优化。
脚本如下,注意确保脚本在 ./redis-cli 统计目录,或修改为绝对 redis-cli 绝对路径执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
##redis主机IP
host=$1
##redis端口
port=$2
##key模式
pattern=$3
db=$4
##游标
cursor=0
##退出信号
signal=0

echo "">~/keys.txt

##循环获取key并删除
while [ $signal -ne 1 ]
do

##将redis scan得到的结果赋值到变量
re=$(./redis-cli -h $host -p $port -c -n $db scan $cursor count 1000 match $pattern)

##以换行作为分隔符
IFS=$'\n'

##转成数组
arr=($re)

##第一个元素是游标值
cursor=${arr[0]}

##打印数组
len=${#arr[*]}
for ((i=1;i<len;i++))
do
a=${arr[i]}
echo $a >> ~/keys.txt
done

##游标为0表示没有key了
if [ $cursor -eq 0 ];then
signal=1
fi
done
echo 'done'

得到 keys.txt 文件后,使用 awk, uniq, sort 等命令进行归并排序,脚本如下:

1
2
sort keys.txt >> keys-sort.txt
cat keys-sort.txt | awk -F ':' '{print $1":"$2":"$3}' | uniq -c | sort -rn

分隔符和打印内容可以按实际情况调节输出,便于阅读。输出结果后,便可定位具体的Key进行优化了。