解决了Redis大key问题,同事们都夸他牛皮

前言

前几天元宵节,小黑准时下班回到家,吃着汤圆,看着电视,好生惬意!

忽然,手机叮咣叮咣响个不停报警,看了下是某个服务调用Redis异常了。

放下饭碗,小黑打开电脑一顿排查,最终定位到是Redis有大key问题。

寻思一时半会儿也解决不了,明天到公司再搞,先继续看电视吧 哈哈哈。

什么是大key

很多朋友肯定在想redis的key能有多大呀?

这里就有个误区了,所谓的大key问题是某个key的value比较大,所以本质上是大value问题。

这样就对上了,key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。

设想一种场景:

在线音乐app中,某个歌单有很多用户收藏,假如有这样的数据结构:

  • 歌单和用户之间的映射关系采用redis存储
  • redis的key是歌单ID,长度可控且很小
  • redis的value是个list,list包含了用户ID
  • 用户可能很多,就导致list长度不可控

这下明白啥是大key问题了吧!

redis中有常见的几种数据结构,每种结构对大key的定义不同,比如:

  • value是String类型时,size超过10KB
  • value是ZSET、Hash、List、Set等集合类型时,它的成员数量超过1w个

上述的定义并不绝对,主要是根据value的成员数量和字节数来确定,业务可以根据自己的场景也确定标准。

大key有什么影响

我们都知道,redis的一个典型特征就是:核心工作线程是单线程。

单线程中请求任务的处理是串行的,前面完不成,后面处理不了,同时也导致分布式架构中内存数据和CPU的不平衡。

  • 执行大key命令的客户端本身,耗时明显增加,甚至超时
  • 执行大key相关读取或者删除操作时,会严重占用带宽和CPU,影响其他客户端
  • 大key本身的存储带来分布式系统中分片数据不平衡,CPU使用率也不平衡
  • 大key有时候也是热key,读取操作频繁,影响面会很大
  • 执行大key删除时,在低版本redis中可能阻塞线程

这样看来大key的影响还是很明显的,最典型的就是阻塞线程,并发量下降,导致客户端超时,服务端业务成功率下降。

大key是如何产生的

大key的产生往往是业务方设计不合理,没有预见vaule的动态增长问题:

  • 一直往value塞数据,没有删除机制,迟早要爆炸
  • 数据没有合理做分片,将大key变成小key

如何找到大key

增加内存&流量&超时等指标监控

由于大key的value很大,执行读取时可能阻塞线程,这样Redis整体的qps会下降,并且客户端超时会增加,网络带宽会上涨,配置这些报警可以让我们发现大key的存在。

bigkeys命令

使用bigkeys命令以遍历的方式分析Redis实例中的所有Key,并返回整体统计信息与每个数据类型中Top1的大Key

redis-rdb-tools

使用redis-rdb-tools离线分析工具来扫描RDB持久化文件,虽然实时性略差,但是完全离线对性能无影响。

redis-rdb-tools是由Python写的用来分析Redis的rdb快照文件用的工具,它可以把rdb快照文件生成json文件或者生成报表用来分析Redis的使用详情。

集成化可视化工具

基于某些公有云或者公司内部架构的redis一般都会有可视化的页面和分析工具,来帮助我们定位大key,当然页面底层也可能是基于bigkeys或者rdb文件离线分析的结果。

如何解决大key问题

根据大key的实际用途可以分为两种情况:可删除和不可删除。

删除大key

如果发现某些大key并非热key就可以在DB中查询使用,则可以在Redis中删掉:

  • 当Redis版本大于4.0时,可使用UNLINK命令安全地删除大Key,该命令能够以非阻塞的方式,逐步地清理传入的Key。

Redis UNLINK 命令类似与 DEL 命令,表示删除指定的 key,如果指定 key 不存在,命令则忽略。

UNLINK 命令不同与 DEL 命令在于它是异步执行的,因此它不会阻塞。

UNLINK 命令是非阻塞删除,非阻塞删除简言之,就是将删除操作放到另外一个线程去处理。

  • 当Redis版本小于4.0时,避免使用阻塞式命令KEYS,而是建议通过SCAN命令执行增量迭代扫描key,然后判断进行删除。

Redis Scan 命令用于迭代数据库中的数据库键。

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

压缩和拆分key

当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗。

当value是string,压缩之后仍然是大key,则需要进行拆分,一个大key分为不同的部分,记录每个部分的key,使用multiget等操作实现事务读取。

当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片。

小结

Redis的大key问题,无论在面试还是工作中都很常见,好好理解一波,非常值得。

祝各位老铁 深夜无报警,线上无bug!

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/238105.html<

(0)
管理的头像管理
上一篇2025-04-22 19:07
下一篇 2025-04-22 19:09

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注