查看 Redis 不过期 key
一、使用 Rdbtools 工具包
使用 Rdbtools 工具包通过分析备份 rdb 文件,可以查看期间大 key 情况及过期时间情况。输出 csv 文档列信息情况详见下方附件
--安装 rdb 工具包 (venv) [root@orcls demo]# pip install rdbtools python-lzf --导出所有 key 的信息 rdb -c memory /dump.rdb > memory1.csv ----rdb -c memory 文件目录 > 输出文件名称 ---导出大 key 也可以 按照参数修改即可(如下为导出大于 10 kb key 信息) rdb /dump.rdb -c memory --bytes 10240 -f memory1.csv ---rdb -c memory 文件目录 --bytes 大小 -f 输出文档名称
Rdbtools 常用参数:
-c FILE:指定rdb工具的分析动作,最常用的就是memory(内存报告),除此还有json(转json)、diff(差异比对)、justkeys(仅有key)、justkeyvals(仅有value)
-f FILE:输出结果保存到哪个文件
-n DBS:指定需要分析的数据库,可以指定多个库。如果未指定则分析所有数据库
-k KEYS:指定需要分析的key,支持正则表达式
database | type | key | size_in_bytes | encoding | num_elements | len_largest_element | expiry |
0 | string | kkk | 48 | string | 8 | 8 | |
0 | string | ktest | 160 | string | 64 | 64 | 2023-05-17T09:50:24.564000 |
0 | string | k11 | 88 | string | 2 | 2 | 2023-05-16T08:48:08.832000 |
0 | string | k2222 | 56 | string | 4 | 4 | |
0 | string | k2 | 48 | string | 40 | 40 | |
0 | string | k3 | 80 | string | 28 | 28 | |
0 | string | k1 | 128 | string | 66 | 66 | |
1 | string | k1 | 64 | string | 7 | 7 |
如上附件即为通过 Rdbtools 导出的所有 key 的信息,其中 expiry 列即为过期情况;目前测试核实为 expiry 显示为空即为没有设置过期时间。
该方案的优缺点如下:
优点:下载备份文件至本地分析即可,不影响 Redis 实例正常使用
缺点:缺点是没有实时性
二、scan 遍历
该脚本是通过 scan 对实例进行遍历并判断 key 是否为永不过期情况(即 ttl key 为 -1)。
#!/bin/bash # Redis 通过 scan 找出不过期的 key # SCAN 命令是一个基于游标的迭代器(cursor based iterator):SCAN 命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,以此来延续之前的迭代过程。 # 注意:当 SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当服务器向用户返回值为 0 的游标时,表示迭代已结束! db_ip=10.100.41.148 # redis 连接IP db_port=6379 # redis 端口 password='IootCdgN05srE' # redis 密码 cursor=0 # 第一次游标 cnt=100 # 每次迭代的数量 new_cursor=0 # 下一次游标 redis-cli -c -h $db_ip -p $db_port -a $password scan $cursor count $cnt > scan_tmp_result new_cursor=`sed -n '1p' scan_tmp_result` # 获取下一次游标 sed -n '2,$p' scan_tmp_result > scan_result # 获取 key cat scan_result |while read line # 循环遍历所有 key do ttl_result=`redis-cli -c -h $db_ip -p $db_port -a $password ttl $line` # 获取key过期时间 if [[ $ttl_result == -1 ]];then #if [ $ttl_result -eq -1 ];then # 判断过期时间,-1 是不过期 echo $line >> no_ttl.log # 追加到指定日志 fi done while [ $cursor -ne $new_cursor ] # 若游标不为0,则证明没有迭代完所有的key,继续执行,直至游标为0 do redis-cli -c -h $db_ip -p $db_port -a $password scan $new_cursor count $cnt > scan_tmp_result new_cursor=`sed -n '1p' scan_tmp_result` sed -n '2,$p' scan_tmp_result > scan_result cat scan_result |while read line do ttl_result=`redis-cli -c -h $db_ip -p $db_port -a $password ttl $line` if [[ $ttl_result == -1 ]];then #if [ $ttl_result -eq -1 ];then echo $line >> no_ttl.log fi done done rm -rf scan_tmp_result rm -rf scan_result
该方案的优缺点如下:
优点:实时性高,反映的即为当前实例的当前 key 状态。
缺点:虽然使用的为 scan 分批进行查找,但是 redis 为单线程,且实例内存较大的情况下,执行还是会造成资源打高,不建议生产环境使用;
三、阿里云离线全量 key 分析
使用阿里提供的全量离线 key 分析,可以初步分析当前没有设置过期时间 key 有多少,是什么类型。且 Top 500 BigKey 有明确表示过期时间;Top 500 UexpiredBigKey 表示没有设置过期时间(即永久不过期的 key ) 按照内存大小 Top 500 的数据。
该方案的优缺点如下:
优点:方便,控制台一键生成文档即可
缺点:只能看到 Top 500 key 的情况,没有所有 key 的情况