0
点赞
收藏
分享

微信扫一扫

Redis 无效key清理且不影响服务器

1.导出key到指定文本文件

redis-cli -h 127.0.0.1 -a redis密码 -n 0 –scan –pattern ‘art:vouchers:*’ >vouchers09141127.txt
vouchers09141127.txt有180行数据
art:vouchers:后面是productid
生产环境不要用 keys 去导出数据,keys执行时会阻塞redis server
scan 不会阻塞整个redis server,而是迭代的收集結果

2.把vouchers09141127.txt下载到自己电脑用notepad提取productid另存为新txt文件vouchers09141150.txt。
vouchers09141150.txt有180行product id.

3.从数据库促销表导出所有已存在的productid到productid0914 EXCEL文件

4.复制vouchers09141150.txt 5万个productid到excel文件,创建多个excel文件(电脑cpu为i3如果数据超过5万个的话,EXCL容易死掉处理效率很差。如果电脑CPU是i5或更好,可以尝试10万个productid)。
每个excel文件用vlookup函数去匹配productid0914中的productid,找出不在productid0914的产品id
找出后,用excel连接符&给每个产品id生成 del art:vouchers:7234310且把每个excel中的这些数据复制到txt文件且上传到redis服务器。

5.unix2dos把txt文件转换为Windows格式文件
cat 123.txt | /usr/local/bin/redis-cli -a redis密码 -n 0 –pipe 通过管道命令批量删除多个key执行速度很快。
例如:
unix2dos del0917keys.txt #若要转换多个txt则执行 unix2dos *.txt

cat del0917keys.txt | /usr/local/bin/redis-cli -a redis密码 -n 0 –pipe

备注:可以在 cat命令前加time则可知道删除这个文件文件中的所有key需要多长时间
time cat del0917keys.txt | /usr/local/bin/redis-cli -a redis密码 -n 0 –pipe

6.注意事项:
6.1 在redis时空闲时执行上面步骤5减少对redis服务器的影响。
6.2 redis 3删除key只能用del命令,若redis是redis 4则可用unlink命令是非阻塞的刪除,會以异步方式进行删除。
6.3 redis 3 删除key不会自动清除内存碎片来释放key所占用内存空间需要重启redis. 若要重启redis一定要在服务器空闲时重启。
redis 4.0-RC3版本之后提供了一种清除内存碎片的方法。
设置activedefrag 为 yes可通过下面的命令来设置
config set activedefrag yes

自动清理要同时满足下面两个条件:
active-defrag-ignore-bytes 400mb:如果内存碎片达到了400mb,开始清理(自定义)
active-defrag-threshold-lower 20:内存碎片空间占操作系统分配给 Redis 的总空间比例达到20%时,开始清理(自定义)

除了以上触发清理内存碎片的参数,Redis还提供了两个参数来保证在清理过程中不影响处理正常的请求,如下:

active-defrag-cycle-min 25:表示自动清理过程所用 CPU 时间的比例不低于 25%,保证清理能正常开展
active-defrag-cycle-max 75:表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高。

举报

相关推荐

0 条评论