一次清理Redis中多余的Key的操作过程

在我们的一个系统中,使用一个Redis存储所有的Cache数据。后期因为Redis本身占用资源过大,加入一个新的Redis,而原来Redis中只保留了一种种类数据。此时需要将原Redis中的不使用的数据进行清理。此文就记录了这样一个过程。

将Redis的rdb文件导出

通常有两种方案:

  • 直接使用copy命令复制dump.rdb文件;
  • 通过redis-cli的–rdb命令导出。

将要删除的Key从rdb中导出来

需要首先安装redis-rdb-tools, 可使用pip安装:

1
pip install rdbtools

将所有要删除的KEY导出到csv文件
我们的场景是排除所有包含kt.usertoken的KEY

1
rdb --command memory dump.rdb | grep -v "kt.usertoken" > rkeys.csv

此时生成的CSV文件格式如下:

1
2
3
4
5
6
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,string,"PREFIX_USER_MSG_912c05fac706a6fa679326e95d188f67_0",142,string,2,2
0,string,"PREFIX_USER_MSG_99641fecd9d30a3c07b02836c7a8147f2618cb56_6847",438,string,287,287
0,string,"PREFIX_USER_MSG_c0c694ddbec7a82d1755fcd79026260e834a0e29_0",150,string,2,2
0,string,"PREFIX_USER_MSG_e246022a79f1fbd52b3dbecef18c51d27a6f3e9f_0",150,string,2,2
0,string,"PREFIX_USER_MSG_719bd47ebf34743150b5535d841e9628bc27decd_6851",153,string,2,2

将CSV中的KEY字段导出:

1
sed '1d' rkeys.csv | awk 'match($0, /\,\"(.*)\"\,/, a) {print a[1]}' > rkeys.txt

此时生成的rkeys.txt文件中就包含所有的KEY,可通过写一个python程序读此文件完成实际的删除。生成文件内容样例:

1
2
3
4
PREFIX_USER_MSG_912c05fac706a6fa679326e95d188f67_0
PREFIX_USER_MSG_99641fecd9d30a3c07b02836c7a8147f2618cb56_6847
PREFIX_USER_MSG_c0c694ddbec7a82d1755fcd79026260e834a0e29_0
PREFIX_USER_MSG_e246022a79f1fbd52b3dbecef18c51d27a6f3e9f_0

操作过程中遇到的一些坑

  • 使用csvtool无法操作大文件,所以采用awk代替。
  • 使用bash脚本来读取rkeys.txt进而调用redis-cli del来进行KEY的删除很容易出现“特殊字符”问题,所以尽量使用程序来删除。