Redis 中的BigKey问题

什么是BigKey问题?

BigKey的具体表现是Redis中的key对应的value很大,很占空间,本质上是大value问题。 对于Redis中不同的数据结构类型,举几个常见的例子:

  • 对于String类型的value,值超过10MB(数据值很大);

  • 对于Set类型的value,含有成员数量为10000个(成员数量多);

  • 对于List类型的value,含有成员数量为10000个(成员数量多);

  • 对于Hash类型的value,含有的成员数量1000个,但所有成员变量的总value值大小为1000MB(成员总体积过大);

BigKey问题怎么产生

  1. Redis中 的key-value键值对设置不当,造成key对于value值特别大。

  2. 对于list,set这种类型对结构,无效的数据没有及时的删除。

  3. 对业务分析不准确,导致实际业务中的value值过大,如热点问题,微博热搜等。

BigKey怎么定位

  1. 使用Redis自带的命令redis-cli --bigkeys,在线扫描大key,显示的信息不详细,这个命令不是阻塞的,所以不影响Redis的正常使用。

  2. 使用第三方工具redis-rbd-tools,使用过程中会先使用bgsave命令dump一个rdb镜像,然后对这个镜像进行分析,因为bgsave是Redis中的一个子线程进行生成镜像,并不影响Redis对外的服务。

  3. debug object方法 执行 debug object key 命令 serializedlength表示的是*这个key对应的value经embstr压缩之后的字节数,涉及Redis底层结构,Redis3.2 之后,当String 不是数字字符串当时候,字节数小于44,使用raw的方式存储,当大于44字节的时候使用embstr的方式存储,也就是压缩后的字符串。

BigKey造成的影响

  1. 占用内存增大 相比于正常的key读取大key需要的内存会增大,如果像是value中的list不断变大,可能会照成OOM,还有一种就是达到Redis设置的最大内存maxMemeory值会造成写阻塞或者部分重要的key被Redis淘汰策略给删除了。

  2. 网络阻塞延迟变大 在读取大key时,由于读取大内容较多,占用较大的带宽,造成网络带宽的阻塞,也会影响其他的应用,导致网络阻塞延迟变大。

  3. IO阻塞延迟增大 BigKey对应的value相对较大,当对较大的key进行读写,耗费的时间较长,这样就可能阻塞后续的请求处理,其实主要是BigKey的value进行IO写的时候会耗费较长的时间,IO写是把处理之后值通过网络返回给请求端。因为Redis的核心线程是单线程,也就是工作线程是单线程,单线程的任务处理是串行的,前面的任务完成之后,后面的任务才能继续执行,所以因为单个key的原因造成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的问题的原因:也就是Redis键值对中对于的value比较大。

对于BigKey问题的发现:可以通过第三方工具或者自带的命令扫描发现。

对于BigKey问题的解决方案:通过拆分、压缩,清理无效数据等方法对这些大value进行处理即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值