前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇弄懂Redis中的BigKey问题

一篇弄懂Redis中的BigKey问题

作者头像
知识浅谈
发布2022-11-11 18:21:03
7600
发布2022-11-11 18:21:03
举报
文章被收录于专栏:分享学习分享学习

? 作者:知识浅谈,CSDN签约讲师,CSDN原力作者,后端领域优质创作者,热爱分享创作 ? 公众号:知识浅谈 ? 擅长领域:后端全栈工程师、爬虫、ACM算法 ? 联系方式vx:zsqtcc

前段时间,看到这个BigKey的问题,因为理解的模糊不清的不太舒服,于是就有了下文的总结。

?

?这次都给他拿下?

正菜来了???

?redis中的BigKey问题及解决方案?

?BigKey问题是什么

BigKey的具体表现是redis中的key对应的value很大,占用的redis空间比较大,本质上是大value问题。 常几个常见的例子: ● 对于String类型的value值,值超过5MB(数据值过大); ● 对于List类型的value值,含有的成员数量为20000个(成员数量多); ● 对于ZSet类型的value值,含有的成员数量为10000个(成员数量多); ● 对于Hash格式的value值,含有的成员数量1000个,但所有成员变量的总value值大小为100MB(成员总的体积过大);

?BigKey问题怎么产生

  1. redis中的key-value键值对设置不当,造成key对应的value值特别大。
  2. 对于list,set这种类型的结构,无效的数据没有及时的删除。
  3. 对业务分析不准确,导致实际业务中value值过大,如热点问题。

?BigKey问题怎么定位

  1. 使用redis自带的命令 redis-cli --bigkeys 在线扫描大key,显示的信息不详细,但是不影响redis的正常使用。
  2. 使用第三方工具redis-rdb-tools,使用过程中会先使用bgsave命令dump一个rdb镜像,然后对这个镜像进行分析,不影响redis对外提供服务。

?BigKey造成的影响

  1. 占用内存增大 相比于正常的Key,读取大key需要的内存会有所增大,如果像是value中的list不断变大,可能会造成OOM(内存溢出),还有一种就是达到redis设置的最大内存maxmemory值会造成写阻塞或者部分重要的Key被redis的淘汰策略给删除了。
  2. 网络阻塞延迟变大 在读取大key的时候,由于读取的内容较多,占用较大的带宽,造成网络带宽的阻塞,也会影响其他的应用,导致网络阻塞延迟变大。
  3. IO阻塞延迟增大 BigKey问题对应的value相对较大,当对较大的value进行读写,耗费的时间较长,这样就可能阻塞后续的请求处理,其实主要是BigKey的value进行IO写的时候会耗费较长的时时间,IO写是把处理之后值通过网络返回给请求端,因为Redis的核心线程是单线程,也就是工作线程是单线程,单线程中的任务处理是串行执行的,前面的任务完成之后,后面的任务才能继续执行,所以因为单个BigKey的原因可能造成IO阻塞延迟。
  4. .BigKey迁移困难 这个问题是出现在Redis集群中,当需要对大value进行迁移(对于Redis 集群slot的迁移),主要是使用migrate命令进行迁移的,migrate命令是通过dump和restore和del三个命令组合成原子命令完成,如果是存在bigkey的话,可能会因为大value的原因导致迁移失败,而且较慢的migrate会阻塞Redis,影响Redis服务。

?BigKey问题如何解决

  1. 针对BigKey进行拆分 通过将BigKey拆分成多个小Key的键值对,并且拆分后的对应的value大小和拆分成的成员数量比较合理,然后进行存储即可,在获取的时候通过get不同的key或是用mget批量获取存储的键值对。
  2. 清理无效的数据 这个主要是针对像是list和set这种类型,在使用的过程中,list和set中对应的内容不断增加,但是由于之前存储的已经是无效的了,需要定时的对list和set进行清理。
  3. 压缩对应的BigKey的value 可以通过序列化或者压缩的方法对value进行压缩,是其变为较小的value,但是如果压缩之后如果对应的value还是特别大的话,就需要使用拆分的方法进行解决了。
  4. 监控Redis中内存,带宽,增长率 通过监控系统,监控redis中的内存占用大小和网络带宽的占用大小,以及固定时间内的内存占用增长率,当超过设定的阈值的时候,进行报警通知处理。 温馨提醒:这个有点多,请仔细看下去

?拓展

相对于BigKey,热Key也是一个值得关注的点。 热key:对于Redis中的某个Key接收到的QPS、显著高于其它Key,我们称之为热Key,常见的热Key如 热key产生的问题:热Key因为频繁的访问。占用大量的Redis CPU时间使其性能变差并影响其它请求; 热key的解决方案:可以使用使用读写分离架构,如果热Key的产生来自于读请求,那么读写分离是一个很好的解决方案。在使用读写分离架构时可以通过不断的增加从节点来降低每个Redis实例中的读请求压力。

?总结

对于BigKey的问题的原因:也就是键值对中对应的value比较大,对于BigKey问题的发现可以通过第三方工具或者自带的命令进行扫描发现,通过拆分,压缩,清理等方法对这些大value进行处理即可。

本文参与?腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ?
  • ?redis中的BigKey问题及解决方案?
    • ?BigKey问题是什么
      • ?BigKey问题怎么产生
        • ?BigKey问题怎么定位
          • ?BigKey造成的影响
            • ?BigKey问题如何解决
            • ?拓展
            • ?总结
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com