02——BigKey
一、MoreKey案例
-
大批量往redis里面插入2000w测试数据key
-
真实生产案例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfbSfvNL-1692427337323)(https://you-blog.oss-accelerate.aliyuncs.com/2023/202303052248850.png)]
生产上严禁使用
keys */ flushdb/flushall
。通过修改配置文件redis.conf,严禁使用高危命令。
rename-command keys "" rename-command flushdb "" rename-command flushall ""
-
不能用
keys *
,因为会卡顿,那用什么使用scan命令,和MySQL的limit有类似,但不完全相同。
scan:增量遍历集合中的元素,除scan外,还有sscan、hscan、zscan
公式:
scan cursor [MATCH pattern] [COUNT count] scan 434176 match k10* count 100
特性:
- 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。
- 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历。
- 不保证每次执行都返回某个给定数量的元素,支持模糊查询。
- 一次返回的数量不可控,只能是大概率复合count参数。
遍历顺序:
非常特别,它不是从第一维数组的第零位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的重复遍历和遗漏。
二、BigKey案例
大的不是key,而是key对应的value
-
多大算big
阿里云redis开发规范
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTEFqao7-1692427337324)(https://you-blog.oss-accelerate.aliyuncs.com/2023/202303052311463.png)]
string类型对应的是value值,最大是512MB,但超过10KB就是bigkey
list、hash、set和zset,个数超过5000就算是bigkey。
为什么对于二级结构的数据,个数超过5000,就算bigkey呢?理论上一个list、hash、set可以存超过40亿的数据。
-
有哪些危害
- 内存不均,集群迁移困难
- 超时删除,bigKey删除做梗
- 网络流量阻塞
-
如何产生
- 社交类:某个明星粉丝量徒增
- 汇总计算:报表,年月日累积
-
如何发现
-
使用
redis-cli –bigkeys
好处:给出每种数据结构Top 1bigkey,同时给出每种数据类型的键值个数、平均大小
不足:不能查询大于10kb的所有可以key
使用注意:为防止扫描时资源效果过多,影响业务,在命令中加入休眠时间
# 每隔100条scan指令,就会休眠0.1s,ops就不会剧烈抬升,但是扫描时间会变长 redis-cli --bigkeys -i 0.1
-
使用
memory usage
命令,统计key和value在RAM中所占用的字节数。使用:
momory usage k100
-
-
如何删除
- 非string类型的bigkey,不能使用del删除;对于list、hash、set需要使用scan对应的命令,渐进式删除。
- 对应string类型,一般使用del,过于庞大,使用unlink
- 对于hash,先使用hscan获取少量field-value,再使用hdel删除field
- list:使用ltrim渐进式删除,直到全部删除
- set:使用sscan获取部分元素,再使用srem删除每个元素
- zset:使用zcan获取部分元素,再使用zremrangebyrank命令删除每个元素
三、BigKey生产调优
lazy freeing
redis删除:
- 阻塞:del
- 非阻塞:unlink、flushall、flushdb
配置lazy freeing:
lazyfree-lazy-server-del yes
replica-lazy-flush yes
lazyfree-lazy-user-del yes