一篇搞定Redis中的BigKey问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: BigKey的具体表现是redis中的key对应的value很大,占用的redis空间比较大,本质上是大value问题。

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

🤞这次都给他拿下,整得明明白白的🤞

正菜来了🛴🛴🛴

🍖redis中的BigKey问题及解决方案❓

🎈BigKey问题是什么

BigKey的具体表现是redis中的key对应的value很大,占用的redis空间比较大,本质上是大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的正常使用。

网络异常,图片无法展示
|

  1. 使用第三方工具redis-rdb-tools,使用过程中会先使用bgsave命令dump一个rdb镜像,然后对这个镜像进行分析,因为bgsave是redis中的一个子线程进行生成镜像的,并不影响redis对外提供服务。
  2. debug object方法
C:\Users\93676\Desktop>redis-cli
127.0.0.1:6379> set a "sadasd"OK
127.0.0.1:6379> debug object a
Value at:00007FCD3EC12FE0 refcount:1 encoding:embstr serializedlength:7 lru:14754079 lru_seconds_idle:15

serializedlength表示的是a这个key对应的value经过embstr压缩之后的字节数,这里涉及到一点redis中的String底层结构的之后,redis3.2 版本之后,当string不是数字字符串的时候,字节数大于44,使用raw的方式存储,当下雨44字节的时候使用embstr的方式存储,也就是压缩后的字符串。

🎈BigKey造成的影响

  1. 占用内存增大

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

  1. 网络阻塞延迟变大

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

  1. IO阻塞延迟增大

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

  1. BigKey迁移困难

这个问题是出现在Redis集群中,当需要对大value进行迁移(对于Redis 集群slot的迁移),主要是使用migrate命令进行迁移的,migrate命令是通过dump和restore和del三个命令组合成原子命令完成,如果是存在bigkey的话,可能会因为大value的原因导致迁移失败,而且较慢的migrate会阻塞Redis,影响Redis服务。

🎈BigKey问题如何解决

  1. 针对BigKey进行拆分

通过将BigKey拆分成多个小Key的键值对,并且拆分后的对应的value大小和拆分成的成员数量比较合理,然后进行存储即可,在获取的时候通过get不同的key或是用mget批量获取存储的键值对。

  1. 清理无效的数据

这个主要是针对像是list和set这种类型,在使用的过程中,list和set中对应的内容不断增加,但是由于之前存储的已经是无效的了,需要定时的对list和set进行清理。

  1. 压缩对应的BigKey的value

可以通过序列化或者压缩的方法对value进行压缩,是其变为较小的value,但是如果压缩之后如果对应的value还是特别大的话,就需要使用拆分的方法进行解决了。

  1. 监控Redis中内存,带宽,增长率

通过监控系统,监控redis中的内存占用大小和网络带宽的占用大小,以及固定时间内的内存占用增长率,当超过设定的阈值的时候,进行报警通知处理。温馨提醒:这个有点多,请仔细看下去

🍚拓展

热key问题

相对于BigKey,热Key也是一个值得关注的点。

热key:对于Redis中的某个Key接收到的QPS、显著高于其它Key,我们称之为热Key,常见的热Key如

热key产生的问题:热Key因为频繁的访问。占用大量的Redis CPU时间使其性能变差并影响其它请求;

热key的解决方案:可以使用使用读写分离架构,如果热Key的产生来自于读请求,那么读写分离是一个很好的解决方案。在使用读写分离架构时可以通过不断的增加从节点来降低每个Redis实例中的读请求压力。

💯总结

对于BigKey的问题的原因:也就是Redis键值对中对应的value比较大。

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

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
27天前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
43 2
|
4月前
|
NoSQL Redis 容器
Redis性能优化问题之如何判断 Redis 实例是否写入了 bigkey
Redis性能优化问题之如何判断 Redis 实例是否写入了 bigkey
|
6月前
|
存储 缓存 NoSQL
Redis经典问题:BigKey问题
BigKey问题常困扰着Redis用户,其影响不容忽视。本文将深入探讨BigKey问题的本质及解决方案,帮助你优化Redis性能,提升系统稳定性。
513 2
|
6月前
|
NoSQL Redis
Redis入门到通关之扫描 bigKey
Redis入门到通关之扫描 bigKey
57 0
|
存储 NoSQL 算法
Redis中的BigKey问题:排查与解决思路
Redis中的BigKey问题:排查与解决思路
577 0
|
6月前
|
机器学习/深度学习 监控 NoSQL
Redis进阶-如何发现和优雅的处理BigKey一二事
Redis进阶-如何发现和优雅的处理BigKey一二事
86 0
|
6月前
|
存储 缓存 NoSQL
Redis进阶-Redis键值设计及BigKey问题
Redis进阶-Redis键值设计及BigKey问题
79 0
|
存储 NoSQL Redis
Redis之bigkey问题解读
Redis之bigkey问题解读
|
存储 NoSQL Redis
Redis del bigkey即使开启了lazyfree,为什么还是阻塞的,但是别人又不阻塞?why
Redis del bigkey即使开启了lazyfree,为什么还是阻塞的,但是别人又不阻塞?why
|
NoSQL Redis
Redis 扫描 bigKey
Redis 扫描 bigKey