开发者社区> 知识浅谈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

一篇搞定Redis中的BigKey问题

简介: 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的正常使用。

image

  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 的运维实战
29 0
redis入门到精通系列(一):入门redis看这一篇就够了
如果你是计算机专业学生 ,那么一定使用过关系型数据库mysql。在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿甚至系统崩溃的情况。最典型的例子就是早期的12306购票网站,一旦到了购票高峰期,12306肯定崩溃。造成这个原因的罪魁祸首就是关系型数据库。
120 0
面试突击 004 | 如何排查 Redis 中的慢查询?视频实战篇
面试突击 004 | 如何排查 Redis 中的慢查询?视频实战篇
82 0
Redis的运维实战 ——仲肥
内容简要: 一、Redis社区 二、阿里云Redis 三、企业版Tair
407 0
本人新书-Redis开发与运维-目录
声明: 原定书名《Redis3开发运维最佳实践》改为《Redis开发与运维》,因为根据最新的广告法,书名不允许有最字。 一、图书简介 本人和同事撰写的新书《Redis开发与运维》近期已经截稿,本书重点关注Redis开发运维中方方面面的问题,作者是来自搜狐视频一线的Redis开发和运维工程师-付磊和张益军。
1782 0
redis.conf中文版注释
# Redis示例配置文件 # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k、5GB、4M这样的常见格式:## 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1mb => 1024*1024 bytes# 1g => 1000000000 bytes# 1gb => 1024*1024*1024 bytes## 单位是大小写不敏感的,所以1GB 1Gb 1gB的写法都是完全一样的。
716 0
+关注
知识浅谈
🍁 作者:知识浅谈,CSDN签约讲师,阿里云社区专家博主,华为云云享专家,热爱分享创作 💒 公众号:知识浅谈 📌 擅长领域:全栈工程师、爬虫、ACM算法 🔥 联系方式vx:zsqtcc
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Redis4.0解密
立即下载
高并发分布式缓存Redis6.0
立即下载
Redis Cluster的基本原理
立即下载