问题
Redis集群因为开发人员问题,放入过多的没有设备过期时间的缓存,导致Redis内存使用过高。
解决方案
- 把过期的KEY找出来,批量删除。
- 安装Redis-cli (生产环境大部分都是集群,或者云服务,不要在安装Redis的机器上操作),下面是Centos系统操作脚本
# 安装基础依赖 yum install -y gcc wget # 下载包 wget http://download.redis.io/redis-stable.tar.gz # 解压 tar xvzf redis-stable.tar.gz cd redis-stable # 编译 make redis-cli # sudo cp src/redis-cli /usr/local/bin/
- 执行批量删除脚本
-h Redis服务器地址redis-cli -h host -p port -a password keys "ABC*" |xargs redis-cli -h host -p port -a password keys "ABC*" del
-p Redis服务端口
-a Redis服务密码
keys 查询key
- 业务切换Redis DB到其他逻辑库,把有问题的库的数据全部清除。
flushdb // 清除当前数据库的所有keys
flushall // 清除所有数据库的所有keys
- 修改程序,设置Key过期时间,并且设置Redis淘汰策略为allkeys-lru,这个需要自己评估一下Redis是否有特殊用法。
volatile-lru,针对设置了过期时间的key,使用lru算法进行淘汰。
allkeys-lru,针对所有key使用lru算法进行淘汰。
volatile-lfu,针对设置了过期时间的key,使用lfu算法进行淘汰。
allkeys-lfu,针对所有key使用lfu算法进行淘汰。
volatile-random,从所有设置了过期时间的key中使用随机淘汰的方式进行淘汰。
allkeys-random,针对所有的key使用随机淘汰机制进行淘汰。
volatile-ttl,删除生存时间最近的一个键。
noeviction(默认),不删除键,值返回错误。