场景:
近一年来,公司redis服务器可用内存持续缓慢下降,究其原因,较早之前的key没有设置过期时间,最终变成了一些死key。
参考文章:https://my.oschina.net/u/3023401/blog/2206618
1、需要清理的keys。
未设置ttl的keys,且半年内无访问。
2、redis 删除过期建策略。
Redis删除过期键有两种策略:passive way和active way.
- passive way(惰性删除):当客户端访问到过期键时,发现它已过期,Redis会主动删除它
- active way(定期删除):Redis会定期调用删除过期键,调用频率由参数hz控制,默认每秒调用10次
3、获取keys的idletime
127.0.0.1:6379> set aa bb OK 127.0.0.1:6379> object idletime aa (integer) 12 127.0.0.1:6379> get aa # 访问后,idletime会清零 "bb" 127.0.0.1:6379> object idletime aa (integer) 2
4、清理过期的idletime脚本。
#!/bin/bash file_dir="/data/tmp" redis-cli -h jkb-hw-prod-apple1 -p 6391 --scan >$file_dir/$port.keys ruleTime='12960000' while read line do storageTime=$(redis-cli -h jkb-hw-prod-apple1 -p 6391 OBJECT IDLETIME ${line}|awk '{print $1}') if [ ! "${storageTime}x" == "x" ];then if [ ${storageTime} -gt ${ruleTime} ];then redis-cli -h jkb-hw-prod-apple1 -p 6391 del ${delKey} fi fi echo "${rowProcessed}" >/data/tmp/record-number.txt done <$file_dir/$port.keys