【缓存】热key和大key问题

news/2024/9/25 17:13:49/文章来源:https://www.cnblogs.com/clarino/p/18431739

参考:

Redis中BigKey和HotKey的检测及处理详解

https://www.alibabacloud.com/blog/a-detailed-explanation-of-the-detection-and-processing-of-bigkey-and-hotkey-in-redis_598143?spm=a2796.7996630.8896513680.1.373a54b0xTX6yZ

Redis 热点键发现及常见解决方案

https://www.alibabacloud.com/blog/redis-hotspot-key-discovery-and-common-solutions_594446?spm=a2c65.11461447.0.0.19f33025TunEqe


 

一、概念

BigKey 和 HotKey 的标准有所不同,但是很显然评判的维度是相同的:BigKey通常由数据大小和成员数量决定,而HotKey 则由 Redis 接收的请求频率和次数决定。

BigKey 的定义

一般我们将包含大量数据或大量成员和列表的键称为BigKey。以下是一些示例,可帮助您全面了解BigKey的特点。

  • 一个 STRING 键,其值的大小为 5 MB(数据太大)。
  • 具有 20,000 个元素的 LIST 键(列表中的元素数量过多)。
  • 一个有 10,000 个成员的 ZSET 键(成员数量过多)。
  • 一个 HASH 密钥,即使只包含 1,000 个成员,其大小也为 100MB(密钥的大小太大)。

需要注意的是,根据 Redis 的实际使用情况和业务场景,BigKey 的定义可能会有所不同。也就是说,您需要综合考虑所有因素来判断。在给出的示例中,您可以看到键的大小、成员和元素的一些具体数字,这不是 BigKey 的通用定义,它只是为了简化说明,不能作为事实上的标准。

HotKey的定义

当访问某个键的工作量明显高于其他键时,我们可以将其称为 HotKey。为了帮助您更好地理解 HotKeys 的样子,这里有一些示例,请查看以下内容。

  • 一个Redis实例的每秒总访问量是1万次,而某个key的每秒访问量就达到了7千次(很明显这个key是一个HotKey,其访问量明显高于其他key)。
  • 一个拥有数千个成员、总大小为 1MB 的 HASH 键每秒会收到大量 HGETALL 请求。(在这种情况下,我们称之为 HotKey,因为访问一个键所消耗的带宽明显高于访问其他键。)
  • 一个拥有上万个成员的 ZSET key,每秒会收到大量的 ZRANGE 请求。(很明显,它的 CPU 运行时间明显高于其他 key 的请求时间。同样,我们可以说这种 CPU 消耗大的 key 是一个 HotKey。)

 

二、引发的典型问题:

在使用Redis时,BigKey和HotKey会带来各种各样的问题,最常见的就是性能下降、访问超时、访问倾斜、数据倾斜等。

BigKey 导致的典型问题

  • 客户端的响应延迟,感觉就像 Redis 的速度变慢了。
  • Redis 内存使用量持续增长,达到 maxmemory 导致 OOM 或者写阻塞,以及重要 key 被驱逐。
  • 发生访问倾斜可能会导致某个 Redis 实例达到性能瓶颈,从而导致整个集群也达到性能瓶颈。这种情况下,Redis Cluster 中某个节点的内存使用量通常会远远超过其他节点,因为该节点上有对 BigKey 的访问请求,而 Redis Cluster 中数据迁移的最小粒度是导致该节点内存无法均衡的关键。也就是说,除非找到将 BigKey 划分为小 Key 的方法,否则该问题无法得到解决。
  • Redis 应该提供的所有服务都会受到影响,因为 Redis 变得越来越慢,这都是因为 BigKey 上的读取请求占用了 Redis 的所有带宽。
  • 删除BigKey时,主数据库长时间阻塞,导致同步中断或故障转移。

HotKey 引起的典型问题

  • HotKeys通常需要较长的CPU运行时间,从而降低Redis的性能并影响其他请求。
  • 某些 Redis 节点/机器上的热点(而不是分片到不同 Redis 节点的键上的热点)通常会阻止您充分利用 Redis 集群。因为这些节点的内存/CPU 负载会非常重,而其他节点的利用率却很低。
  • 对于抢购、秒杀的场景,经常会出现超卖的情况,因为对应商品key的库存读请求数量太多,超出了Redis实例的性能承受能力。
  • HotKeys 上的流量突然暴增到 Redis 能够承受的最大阈值,甚至导致缓存服务崩溃,也就是我们常说的 Redis 雪崩。如果发生这种情况,大量的请求会直接冲击后端数据库,导致数据库层负载过高,数据库可能无法承受而宕机,从而影响业务。

 

三、BigKey 和 HotKey 的常见原因

业务规划不充分、 Redis使用不当、无效数据堆积、访问量突然增加等都可能导致 BigKey 和 HotKey 问题。例如:

BigKey

1)使用Redis不合适的数据类型会引入BigKey问题,比如使用String类型的键存储较大的二进制文件会导致键的值过大。

2)业务上线前规划设计不足,没有制定合理的分片策略或者拆分计划,无法将单个key中的成员拆分到多个key中,导致某个key中的成员数量过多。

3)没有定期对HASH键中的无效数据进行清理,导致HASH键中成员不断增加,可能带来BigKey问题。

HotKey

1、由于热门产品、热门新闻、KOL(关键意见领袖)直播活动或大量玩家参与的在线游戏对战等原因,访问流量意外增加。

2、业务方逻辑故障,导致LIST键无法被消费,从而导致对应Key中的成员数量不断增加,并且没有减少的趋势。

3、请求切片数超出单台服务器的性能阈值:当服务器上访问某条数据时,通常会对数据进行拆分或者切片,在这个过程中,会访问服务器上对应的key,当访问量超过服务器的性能阈值时,就会出现热键问题。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803555.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM大模型: 生成式模型的数学原理和prompt融入image

1、(1)上文介绍了DDPM生成图片的原理和代码测试结果,训练时给样本图片加上gaussian noise,预测时也是预测gaussian noise;这里为啥要用gaussian distribution?为啥不用其他的分布?高斯分布相对比较简单,只有两个参数:均值和方差,容易控制;为啥一张随机生成的gaussio…

P3311 [SDOI2014] 数数

参考题解做法。 题目思路 数位 dp + AC 自动机好题。 直接往下递归,dfs(u, ver, limit, st) 表示目前在数字 \(n\) 的第 \(u\) 位进行讨论,\(ver\) 表示当前在 AC 自动机上的节点,\(limit\) 是是否步步紧逼 \(n\),只要位数不足 \(n\) 的位数或者有一位小于 \(n\) 的那一位就…

实验1

任务1 源代码1 #include <stdio.h> 2 int main() 3 { 4 printf("o \n"); 5 printf("<H>\n"); 6 printf("I I\n"); 7 8 return 0; 9 }

initrdinit进程

initrd的全名是 init ramdisk,是一个启动时存在于内存的文件系统。 kernal 到 initrd的流程在GRUB加载kernel时,kernel会先在内存中制造一个rootfs当做临时的空间供系统使用,接下来,kernel便会将initrd当做是一个系统,将其mount到rootfs上启动。 引入initrd的目的是为了把…

如何部署北斗定位应用,基于国产自主架构LS2K1000LA-i处理器平台

北斗卫星导航系统(以下简称北斗系统)是着眼于国内经济社会发展需要,自主建设、独立运行的卫星导航系统。经过多年发展,北斗系统已成为面向全球用户提供全天候、全天时、高精度定位、导航与授时服务的重要新型基础设施。图 1 北斗定位系统的应用优势 强可控:北斗系统是国内…

ChatGPT 向更多用户推出高级语音模式:支持 50 种语言;字节发布两款新视频生成大模型丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…

题解:CF573D Bear and Cavalry

CF因为这是远古题目,所以根据现在的评测机速度,用 \(O(nq)\) 的做法也是可以过的。 也就是说,我们可以每次操作直接修改对应位置上的数字,然后设计一种 \(O(n)\) 的算法求解答案。 这道题类似资源分配型动态规划,所以我们可以设 \(dp_i\) 表示分配前 \(i\) 个人的答案。 直…

题解:AT_abc204_e [ABC204E] Rush Hour 2

LG变形的 dijkstra。 先思考什么情况下需要等待以及等待多长时间最优。我们把题目上的计算方法按照当前的时间 \(t\) 和通过所需的时间 \(f(t)\) 列个函数关系: \[f(t)=t+c+\lfloor \frac{d}{t+1}\rfloor \]然后用 Desmos 画个图可以得到图像(其实就是对勾函数):因为 \(c,d…

Rust字符串类型全解析

字符串是每种编程语言都绕不开的类型, 不过,在Rust中,你会看到远比其他语言更加丰富多样的字符串类型。 如下图:为什么Rust中需要这么多种表示字符串的类型呢? 初学Rust时,可能无法理解为什么要这样设计?为什么要给使用字符串带来这么多不必要的复杂性? 其实,Rust中对…

AI自动生成代码注释

在vscode 中安装 TONGYI Lingma

通过 Tampermonkey 实现学习通全自动刷课

本文介绍了如何使用 Tampermonkey 这一流行的用户脚本管理器,通过其脚本库实现学习通的全自动刷课。文章详细讲解了 Tampermonkey 的安装步骤、OCS 脚本的配置方法,以及题库的使用流程,帮助读者高效完成学习任务。在学习过程中,自动化工具能大大提升学习效率。Tampermonkey…