主要引入如下模块
一.删除指定模式的key
1.单个节点
使用scan + pipeline + del(每次扫描100个)
|
|
例如删除127.0.0.1:6380中以video开头的key,可以执行如下
|
|
2.集群
借助cluster nodes获取所有master节点,执行上面的函数:
|
|
对于使用者来讲,只需要提供集群中一个可用的节点即可,例如如下:
|
|
二.寻找bigkey
1.单个节点
使用scan + strlen(字符串) | debug object(非字符串)找到字节数在startBytes与endBytes之间的key
|
|
因为debug object中的s是键值序列化后的长度,而且对于非字符串类型debug object命令是有成本的,如下:(每个item都在1~10个字节)
类型 | 长度 | 每个item长度 | 耗时 |
---|---|---|---|
hash | 100000 | 4字节 | 27毫秒 |
hash | 500000 | 4字节 | 137毫秒 |
hash | 1000000 | 4字节 | 255毫秒 |
list | 100000 | 4字节 | 4毫秒 |
list | 500000 | 4字节 | 8毫秒 |
list | 1000000 | 4字节 | 12毫秒 |
set | 100000 | 4字节 | 16毫秒 |
set | 500000 | 4字节 | 85毫秒 |
set | 1000000 | 4字节 | 181毫秒 |
zset | 100000 | 4字节 | 78毫秒 |
zset | 500000 | 4字节 | 355毫秒 |
zset | 1000000 | 4字节 | 733毫秒 |
而且实际上非字符串类型,所谓的bigkey其实我们更关系的是它的长度,所以上述代码稍作改进:
|
|
例如寻找127.0.0.1:6380中10KB~20KB(大约)的key,可以执行如下:
|
|
2.集群
|
|
对于使用者来讲,只需要提供集群中一个可用的节点即可,例如如下:
|
|
三.空闲key
1.单个节点
scan + debug object找到出空闲时间大于idleDays(单位:天)
|
|
例如寻找127.0.0.1:6380中闲置时间大于1天的key,可以执行如下:
|
|
2.集群
|
|
对于使用者来讲,只需要提供集群中一个可用的节点即可,例如如下:
|
|
四.死键
1.单个节点
对于死键问题仅仅需要scan即可解决,有关什么是死键可以参考如下:Redis的“死键”问题
|
|
2.集群
|
|
五、删除bigkey
1.hash类型
hscan + pipeline + hdel + del
|
|
2.set类型
sscan + pipeline + srem + del
|
|
3.zset类型
zscan + pipeline + zrem + del
|
|
4.list类型
llen + ltrim + del
|
|
六、寻找可疑的客户端
client list中的重要属性
1.空闲超过idleSeconds秒的连接
|
|
每个client中若干属性,例如下面
也可以通过awk快速找到idle大的连接
|
|
2.输出缓冲区过大的连接
重点关注:obl、oll、omem
3.输入缓冲区过大的连接
重点关注: quf、qbuf-free
4.重点命令
例如:monitor、flush等
也综合考虑age、idle、qbuf、qbuf-free、obl、oll、omem、cmd等检查集群中不合理的客户端连接
七、短时间热点key的寻找
可以使用redis-faina.py短时间利用monitor找到热点key,具体可以参考Redis热点key寻找与优化