查看 Redis 不过期 key

梦莱2年前技术文章1405

一、使用 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,支持正则表达式

📎memory1.csv

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 的数据。

截屏2023-05-19 15.26.26.png

该方案的优缺点如下:

优点:方便,控制台一键生成文档即可

缺点:只能看到 Top 500 key 的情况,没有所有 key 的情况


相关文章

Linux高并发FastCGI优化

nginx中FastCGI相关参数优化:1)这个指令为FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。fastcgi_cache_path /usr/local/ng...

Doris FE节点故障恢复

Doris FE节点故障恢复

FE故障恢复现象:FE由于元数据损坏导致无法启动            &nbs...

大数据监控系列(二)——Prometheus+Grafana在CDH使用实践(包含Altermanager告警)

大数据监控系列(二)——Prometheus+Grafana在CDH使用实践(包含Altermanager告警)

1 概述我们之前在《大数据监控系列(一)——Promehteus+Grafana监控概述》中对Promehteus和Grafana的基本概念做了介绍,这里将介绍Promehteus和Grafana在c...

K8s cni0网卡异常

K8s cni0网卡异常

一、问题现象pod启动时,调度到其中某个节点上的pod都无法正常启动,查看启动报错:network: failed to set bridge addr: "cni0" alrea...

内存--模拟内存打满

1 tmpfs介绍tmpfs是一种虚拟内存文件系统,正如这个定义它最大的特点就是它的存储空间在VM里面     VM是由linux内核里面的vm子系统管理的东...

TDengine集群部署

TDengine集群部署

1、基础环境操作系统:centos7.9内核版本:3.10下载地址:https://docs.taosdata.com/releases/tdengine/#3110架构设置:3 dnode,3 mn...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。