Redis的热Key问题

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【6月更文挑战第18天】Redis中的热Key是高访问频率的Key,如QPS高、大带宽使用或CPU密集型操作。热Key可能导致CPU占用过高、访问倾斜、缓存击穿和系统性能下降。爆款商品、热点事件等可引发热Key。检测热Key可借助云服务、`redis-cli hotkeys`、业务层监控或`MONITOR`命令。优化策略包括复制热Key到多分片、采用读写分离,但需权衡代码复杂性和数据一致性。

定义

以接收到的Key被请求频率来判定,例如:

  • QPS集中在特定的Key:Redis实例的总QPS为1w,而其中一个Key的每秒访问量达到了7k

  • 带宽使用率:对一个拥有上千个成员且总大小为1 MB的HASH Key每秒发送大量的HGETALL操作请求。

  • CPU使用时间占比:对一个拥有数万个成员的Key(ZSET类型)每秒发送大量的ZRANGE操作请求。

引发的问题

  • 占用大量的CPU资源,影响其他请求并导致整体性能降低

  • 集群架构下,产生访问倾斜,某个数据分片被大量访问,而其他数据分片处于空闲时间,可能会引起该数据分片的连接数被耗尽,新的连接建立请求被拒绝等问题。

  • 在抢购或秒杀场景下,可能因商品对应库存Key的请求量过大,超出Redis处理能力造成超卖

  • 热Key的请求压力数量超出Redis的承受能力易造成缓存击穿,即大量请求被直接指向后端的存储层,导致存储访问量激增甚至宕机,从而影响其他业务。

产生的原因

预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某主播搞活动带来的大量刷屏点赞、游戏中某区域发生多个工会之间的战斗涉及大量玩家等

如何快速找到热Key

云Redis提供的服务

云服务提供的实时Top Key统计服务或是离线全量Key分析服务

通过redis-cli的hotkeys命令

同时,自Redis 4.0版本起提供了hotkeys参数,可以快速帮您找出业务中的热Key,具体操作,请参见通过redis-cli的hotkeys参数查找热Key

通过业务层定位热Key

通过在业务层增加相应的代码对Redis的访问进行记录并异步汇总分析,可以准确并及时的定位热Key,但是业务代码的复杂度会增加,也会降低一些性能

通过MONITOR命令找出热Ke

Redis的MONITOR命令能够忠实地打印Redis中的所有请求,包括时间信息、Client信息、命令以及Key信息。

在发生紧急情况时,可以通过短暂执行MONITOR命令并将返回信息输入至文件,在关闭MONITOR命令后,对文件中请求进行归类分析,找出这段时间中的热Key。

由于MONITOR命令对Redis实例性能消耗较大,非特殊情况不推荐使用MONITOR命令。

如何优化热Key

在Redis集群架构中对热Key进行复制

由于热Key的迁移粒度问题,无法将请求分散至其他数据分片,导致单个数据分片的压力无法下降。此时,可以将热Key进行复制并迁移到其他数据分片,来解决单个数据分片的热Key压力

需要联动修改代码,同时带来了数据一致性的挑战,由原来更新一个Key变为更新多个Key

使用读写分离架构

如果热Key的产生来自于读请求,您可以将实例改造成读写分离架构来降低每个数据分片的读请求压力,甚至可以不断地增加从节点。但是读写分离架构在增加业务代码复杂度的同时,也会增加Redis集群架构复杂度。不仅要为多个从节点提供转发层(如Proxy,LVS等)来实现负载均衡,还要考虑从节点数量显著增加后带来故障率增加的问题。Redis集群架构变更会为监控、运维、故障处理带来了更大的挑战。

相关实践学习
基于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
目录
相关文章
|
1月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
26天前
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
Redis中大Key与热Key的解决方案
|
14天前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
43 3
|
1月前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
|
1月前
|
NoSQL Redis
Redis——大批量删除redis的key
Redis——大批量删除redis的key
40 1
|
1月前
|
NoSQL Redis
Redis——批量设置key的过期时间
Redis——批量设置key的过期时间
32 1
|
1月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
|
2月前
|
存储 缓存 NoSQL
Redis问题之什么是热点key问题,它通常会在什么情况下出现
Redis问题之什么是热点key问题,它通常会在什么情况下出现
67 10
|
1月前
|
NoSQL Redis
Redis Manifest文件问题之key/value对组织如何解决
Redis Manifest文件问题之key/value对组织如何解决
|
1月前
|
NoSQL Go Redis
Go语言中如何扫描Redis中大量的key
在Redis中,遍历大量键时直接使用`KEYS`命令会导致性能瓶颈,因为它会一次性返回所有匹配的键,可能阻塞Redis并影响服务稳定性。为解决此问题,Redis提供了`SCAN`命令来分批迭代键,避免一次性加载过多数据。本文通过两个Go语言示例演示如何使用`SCAN`命令:第一个示例展示了基本的手动迭代方式;第二个示例则利用`Iterator`简化迭代过程。这两种方法均有效地避免了`KEYS`命令的性能问题,并提高了遍历Redis键的效率。
37 0