线上redis有一些历史遗留的未设置过期时间的key,导致redis空间占用较多,DBA告警后要我们自己清除,于是我写了一个脚本在不影响线上服务的情况下清除(使用keys命令会导致请求hang住)
import sys
import redis
import os
pool = redis.ConnectionPool(host = "host_name",password = "pass_word",port = 6379)
r = redis.StrictRedis(connection_pool = pool)
match = sys.argv[1]+"*"
print(match)
count = 10000
for key in r.scan_iter(match = match,count = count):
time = r.ttl(key)
if time==-1:
r.expire(key,1000)
print("set expire key:",key)
print(time)
这里host_name和pass_word打个码
sys.argv[1]指传入的第一个参数,执行的时候就用python3 xxx.py hello 就会自动扫描hello开头的key,步进10000个,然后将其过期时间设为1000秒,过一会就自动过期了。
在业务低峰期的话步进可以设大点,这样清的会比较快,我们为了清几十万个key花了半个多小时。