02_BigKey

02——BigKey

一、MoreKey案例

  1. 大批量往redis里面插入2000w测试数据key

  2. 真实生产案例

    image-20230305224450914

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 ""
    
  3. 不能用keys *,因为会卡顿,那用什么

    使用scan命令,和MySQL的limit有类似,但不完全相同。

    scan:增量遍历集合中的元素,除scan外,还有sscan、hscan、zscan

    公式:

    scan cursor [MATCH pattern] [COUNT count]
    
    scan 434176 match k10* count 100
    

    特性:

    1. 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。
    2. 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历。
    3. 不保证每次执行都返回某个给定数量的元素,支持模糊查询。
    4. 一次返回的数量不可控,只能是大概率复合count参数。

    遍历顺序:

    非常特别,它不是从第一维数组的第零位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的重复遍历和遗漏。

二、BigKey案例

​ 大的不是key,而是key对应的value

  1. 多大算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亿的数据。

  2. 有哪些危害

    1. 内存不均,集群迁移困难
    2. 超时删除,bigKey删除做梗
    3. 网络流量阻塞
  3. 如何产生

    1. 社交类:某个明星粉丝量徒增
    2. 汇总计算:报表,年月日累积
  4. 如何发现

    1. 使用redis-cli –bigkeys

      好处:给出每种数据结构Top 1bigkey,同时给出每种数据类型的键值个数、平均大小

      不足:不能查询大于10kb的所有可以key

      使用注意:为防止扫描时资源效果过多,影响业务,在命令中加入休眠时间

      # 每隔100条scan指令,就会休眠0.1s,ops就不会剧烈抬升,但是扫描时间会变长
      redis-cli --bigkeys -i 0.1
      
    2. 使用 memory usage命令,统计key和value在RAM中所占用的字节数。

      使用:

      momory usage k100
      
  5. 如何删除

    1. 非string类型的bigkey,不能使用del删除;对于list、hash、set需要使用scan对应的命令,渐进式删除。
    2. 对应string类型,一般使用del,过于庞大,使用unlink
    3. 对于hash,先使用hscan获取少量field-value,再使用hdel删除field
    4. list:使用ltrim渐进式删除,直到全部删除
    5. set:使用sscan获取部分元素,再使用srem删除每个元素
    6. zset:使用zcan获取部分元素,再使用zremrangebyrank命令删除每个元素

三、BigKey生产调优

lazy freeing

redis删除:

  1. 阻塞:del
  2. 非阻塞:unlink、flushall、flushdb

配置lazy freeing:

lazyfree-lazy-server-del yes
replica-lazy-flush yes
lazyfree-lazy-user-del yes

image-20230305233930227

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值