我们在使用 Redis 的过程中,有时候会想要知道某些 key 是否长时间没有被访问,如果这些 key 长时间没有人访问,并且还占用了比较大的内存空间时,我们就会想及时的清理掉这些 key。
Redis 本身提供了一个 OBJECT IDLETIME 的命令可以让我们来查询某个 key 最后一次被访问后的秒数。
https://redis.io/commands/object-idletime/
但是这个命令对于分析整个 Redis 实例时会显得十分吃力,免不了 scan + object idletime 的组合。
如果能把这个时间从 rdb 文件读出来再进行分析,可以有效减少对线上实例的影响,同时效率也会高不少。
下面来看看如何做到的。
关键操作符
16进制 | 10进制 | 简称 | 说明 |
0xF8 | 248 | IDLE | 标识LRU的空闲时间 |
0xF9 | 249 | FREQ | 标识LFU的访问频率 |
其中 248 和 249 两个是只会存在一个,但是它们又用的同一个数据结构,所以要把它们放在一起来说明。
下面再看看一个 key value 完整的“数据结构”
252 EXPIRE_TIME_MS|253 EXPIRE_TIME|249 LFU 或 248 LRU|xxx VALUE_TYPE|xxx KEY|xxx VALUE|
可以看到第三部分就是我们所需要的。
rdb-cli 是老黄写的一个开源 rdb 文件分析器,源码地址:https://github.com/catcherwong/rdb-tools,感兴趣的可以关注一下。
rdb-cli 里面有两个命令用于做这一块的分析。
首先是
rdb-cli memory / -ot html / --sep-count 3 / /tmp/biz_a_20240301.rdb
执行这个之后,会生成一个 res.html 文件,打开这个文件会看到下面两个图:
图片
这两个图就是所有 key 的空闲分布,可以看到,就数量而言,这个 redis 实例,有超过 100w 的 key 是在 7天内没有过访问的!!
有这个大致分布,但是还看不到具体的细节,所以我们要用另外一个命令来看具体是那些 key 这么离谱。
rdb-cli csv / --min-idle 604800 / /tmp/biz_a_20240301.rdb
执行这个之后,会生成一个 dump.csv 文件,打开这个文件可以看到下面的内容:
图片
着重看 idle 这一列,单位是秒。
可以看到超过 7天 没访问的,最长的有 16693102 秒,换算成天,是 193 天,接近 200 天。这种数据就不应该存在 redis 里面!
两个命令,用起来还算是比较方便的,也比较快得到结果,当然上述两个命令还有其他的过滤条件可以结合使用,用 -h 即可查看。
对于设置了 LRU 相关策略的 Redis 实例才可以用这个方法去分析空闲分布,如果是 LFU 相关策略的,则无法看到空闲分布!!
原因的话,object idletime 已经告诉我们了。
本文链接:http://www.28at.com/showinfo-26-82031-0.html聊一聊如何离线分析Redis缓存的空闲分布
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 探索C++类中static关键字的妙用