【Redis】获取没有设置ttl的key脚本
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,一 前言在运维Redis的时候,总会遇到使用不规范的业务设计,比如没有对key设置ttl,进而导致内存空间吃紧,通常的解决方法是在slave上dump 出来所有的key ,然后对文件进行遍历再分析。遇
千家信息网最后更新 2026年11月02日【Redis】获取没有设置ttl的key脚本


注意:
代码里面对没有ttl的key的输出做了限制,大家使用的时候可以调整阈值 或者去掉 全部输出到指定的文件里面。欢迎大家使用,并给出功能或者算法上的改进措施。
一 前言
在运维Redis的时候,总会遇到使用不规范的业务设计,比如没有对key设置ttl,进而导致内存空间吃紧,通常的解决方法是在slave上dump 出来所有的key ,然后对文件进行遍历再分析。遇到几十G的Redis实例,dump + 分析 会是一个比较耗时的操作,为此,我开发了一个小脚本直接连接Redis 进行scan 遍历所有的key,然后在检查key的ttl,将没有ttl的key输出到指定的文件里面。二 代码实现
- # encoding: utf-8
- """
- author: yangyi@youzan.com
- time: 2018/4/26 下午4:34
- func: 获取数据库中没有设置ttl的 key
- """
- import redis
- import argparse
- import time
- import sys
- class ShowProcess:
- """
- 显示处理进度的类
- 调用该类相关函数即可实现处理进度的显示
- """
- i = 0 # 当前的处理进度
- max_steps = 0 # 总共需要处理的次数
- max_arrow = 50 # 进度条的长度
- # 初始化函数,需要知道总共的处理次数
- def __init__(self, max_steps):
- self.max_steps = max_steps
- self.i = 0
- # 显示函数,根据当前的处理进度i显示进度
- # 效果为[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100.00%
- def show_process(self, i = None):
- if i is not None:
- self.i = i
- else:
- self.i += 1
- num_arrow = int(self.i * self.max_arrow / self.max_steps) # 计算显示多少个'>'
- num_line = self.max_arrow - num_arrow # 计算显示多少个'-'
- percent = self.i * 100.0 / self.max_steps # 计算完成进度,格式为xx.xx%
- process_bar = '[' + '>' * num_arrow + ' ' * num_line + ']'\
- + '%.2f' % percent + '%' + '\r' # 带输出的字符串,'\r'表示不换行回到最左边
- sys.stdout.write(process_bar) # 这两句打印字符到终端
- sys.stdout.flush()
- def close(self, words='done'):
- print ''
- print words
- self.i = 0
- def check_ttl(redis_conn, no_ttl_file, dbindex):
- start_time = time.time()
- no_ttl_num = 0
- keys_num = redis_conn.dbsize()
- print "there are {num} keys in db {index} ".format(num=keys_num, index=dbindex)
- process_bar = ShowProcess(keys_num)
- with open(no_ttl_file, 'a') as f:
- for key in redis_conn.scan_iter(count=1000):
- process_bar.show_process()
- if redis_conn.ttl(key) == -1:
- no_ttl_num += 1
- if no_ttl_num < 1000:
- f.write(key+'\n')
- else:
- continue
- process_bar.close()
- print "cost time(s):", time.time() - start_time
- print "no ttl keys number:", no_ttl_num
- print "we write keys with no ttl to the file: %s" % no_ttl_file
- def main():
- parser = argparse.ArgumentParser()
- parser.add_argument('-p', type=int, dest='port', action='store', help='port of redis ')
- parser.add_argument('-d', type=str, dest='db_list', action='store', default=0,
- help='ex : -d all / -d 1,2,3,4 ')
- args = parser.parse_args()
- port = args.port
- if args.db_list == 'all':
- db_list = [i for i in xrange(0, 16)]
- else:
- db_list = [int(i) for i in args.db_list.split(',')]
- for index in db_list:
- try:
- pool = redis.ConnectionPool(host='127.0.0.1', port=port, db=index)
- r = redis.StrictRedis(connection_pool=pool)
- except redis.exceptions.ConnectionError as e:
- print e
- else:
- no_ttl_keys_file = "/tmp/{port}_{db}_no_ttl_keys.txt".format(port=port, db=index)
- check_ttl(r, no_ttl_keys_file, index)
- if __name__ == '__main__':
- main()


注意:
代码里面对没有ttl的key的输出做了限制,大家使用的时候可以调整阈值 或者去掉 全部输出到指定的文件里面。欢迎大家使用,并给出功能或者算法上的改进措施。
进度
处理
输出
函数
文件
代码
字符
时候
次数
分析
脚本
吃紧
为此
业务
内存
前言
功能
字符串
实例
总会
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
耶加雪菲
互联网新科技
互联网佳科技有限公司
疫情对互联网科技公司影响
互联网巨头反垄断金融科技
北京互联网科技
成都互联网科技公司
九亚互联网科技
北京互联网络科技有限公司
伴你行互联网科技有限公司
天扬科技互联网广告
新华互联网科技校企合作
互联网科技寓意
阿里互联网科技企业
南博望互联网科技有限公司
科技赋能视角下互联网保险发展
互联网金融科技元年
互联网安防科技感
华人运通互联网科技公司
广东猫王互联网科技有限公司电话
金融科技还是互联网
米客互联网科技
崇明区互联网教育科技诚信经营
恒生互联网科技指数跳水
阿里互联网科技企业
众安科技工业互联网合作
上海科技产业互联网平台
广州千川互联网科技有限公司
福建互联网展示科技馆设计
中国新注册互联网科技