Redis——BigKey
1. MoreKey
当redis key的数量过多时,使用keys*会耗费大量时间和性能,因此在生产上需要禁用一些危险命令。
如何禁用命令
在 redis.conf 文件 SECURITY 板块中设置 rename-command
例如禁用keys,flushdb,flushall
rename-command keys ""
rename-command flushdb ""
rename-command flushall ""
禁用keys*如何迭代查询key
使用scan命令,此外SSCAN用于set类型,HSCAN用于Hash类型,ZSCAN用于ZSet类型
SCAN cursor [MATCH pattern][count count]
// pattern 匹配模式
// count 迭代数量,默认10
遍历key时将cursor设为0,执行scan会返回一个游标值,下一次迭代从该游标值开始,当返回游标值为0时完成一次遍历
查找以tk开头的key
2. BigKey
String类型大于10KB,list、hash、set和zset个数超过5000就可以称为BigKey
危害
- 内存不均,集群迁移困难
- 超时删除
- 网络流量阻塞
如何发现
方法一:--bigkeys
redis-cli --bigkeys
方法二:MEMORY USAGE
该命令给出一个key和它的值在RAM中所占用的字节数
如何删除
非字符串的bigkey不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题,例如200万个zset设置1小时过期,会触发del操作,造成阻塞
String:
一般用del,如果过于庞大用unlink
Hash:
使用hscan每次获取少量field-value,再使用hdel删除每个field
list:
使用ltrim渐进式逐步删除
Set:
使用sscan每次获取少量元素,再使用srem删除每个元素
ZSet:
使用zscan每次获取少量元素,再使用zremrangebyrank删除每个元素
优化
开启惰性删除
lazyfree-lazy-server-del yes
replica-lazy-flush yes
lazyfree-lazy-user-del yes