Redis在遇到数据量暴增或者业务没处理好的时候,会产生很多大的hash,set,这样的对象对 Redis 的集群数据迁移带来了很大的问题,因为在集群环境下,如果某个 key 太大,会数据导致迁移卡顿。另外在内存分配上,如果一个 key 太大,那么当它需要扩容时,会一次性申请更大的一块内存,这也会导致卡顿。如果这个大 key 被删除,内存会一次性回收,卡顿现象会再一次产生。如果你观察到redis的内存忽上忽下,极有可能是大key导致的。查找到大key一般有三种方式:
Redis 官方命令
Redis在 redis-cli 中提供了这种指令:redis-cli -h 127.0.0.1 -p 7001 –-bigkeys
也可以追加一个休眠参数,防止在查询过程 ops 暴增,使用此命令:redis-cli -h 127.0.0.1 -p 7001–-bigkeys -i 0.1
自己写一个脚本
为了避免对线上 Redis 带来卡顿,这就要用到 scan 指令,对于扫描出来的每一个 key,使用 type 指令获得 key 的类型,然后使用相应数据结构的 size 或者 len 方法来得到它的大小,对于每一种类型,保留大小的前 N 名作为扫描结果展示出来。而可以灵活使用 scan,这个命令甚至有 hscan
, sscan
这样的衍生体。
使用第三方工具
暂时业内有大佬写的一个工具:Github Repo
Redis-rdb-cli 工具,最终会生成一个界面工具直观展示结果,可以更好的查看redis的一些运行信息。例如下图这样的: