背景
最近接到一个任务,需要将redis中的key进行rename。之前的结构为XXX-XXX-XXX-*,替换为XXX:XXX:XXX:*。
思路&方案
第一反应想到是用正则,匹配出对应的key,然后利用redis中也有rename命令,支持重命名。尽量都在redis中处理。
后来调研了一下,redis中没有类似于find的命令😩,唯一可用的是keys命令,所以调整方案,使用keys+pattern匹配出所有对应的key,流向shell,shell中对key循环,转换key名。
其中还有一个坑,keys虽然支持正则,但是貌似只支持*,?、+、^都不支持。库中新结构、老结构的数据都有,所以只能枚举了
脚本
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 46 47 48 49
| //创建shell脚本 vim rename.sh
//拷贝如下内容
host=127.0.0.1
port=6379
passwd=123456
patterns=("Answer-*-*-*" "FaqInfo-*-*" "ModelInfo-*-*" "RelatedFaq-*-*-*" "SensitiveWord-*" "Term-*-*-*")
redis-cli -h $host -p $port -a $passwd save echo '备份至=>' redis-cli -h $host -p $port -a $passwd config get dir
for p in ${patterns[@]} do re=$(redis-cli -h $host -p $port -a $passwd --raw keys $p) echo $re arr=($re) echo 'arr.len:'${#arr[@]} for key in ${arr[@]} do newKey=$(echo ${key/\-/\:}) newKey=$(echo ${newKey/\-/\:}) newKey=$(echo ${newKey/\-/\:}) echo $newKey redis-cli -h $host -p $port -a $passwd rename $key $newKey done done
echo 'done'
//授执行权限 chmod 777 rename.sh
//执行 sh rename.sh XXXX XX XX
|
恢复备份
脚本中会先将当前库中内容进行备份,备份到脚本运行目录中,文件名为dump.rdb。
恢复备份操作:
- 停止Redis服务:
redis-cli shutdown
;
- 将dump.rdb文件拷贝到redis安装目录下的bin目录(我的是/usr/local/Cellar/redis/3.2.9/bin);
- 重启redis服务
redis-server &
;