首页 > 其他分享 >【缓存】热key和大key问题

【缓存】热key和大key问题

时间:2024-09-25 17:12:56浏览次数:8  
标签:缓存 成员 Redis 问题 BigKey key HotKey 节点

参考:

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,当访问量超过服务器的性能阈值时,就会出现热键问题。

 

 

标签:缓存,成员,Redis,问题,BigKey,key,HotKey,节点
From: https://www.cnblogs.com/clarino/p/18431739

相关文章

  • QT5程序部署提示缺少Qt5系统库问题的解决方法 symbol lookup error /libQt5XcbQpa.so.
    https://blog.csdn.net/qq_29852231/article/details/128853681 QT5程序部署提示缺少Qt5系统库问题的解决方法问题:在用QT5.12开发程序后,部署至现场(Ubuntu18/20)发现提示缺少QT5的平台库(platform)或者系统提供的QT5平台库无法正常支撑程序运行解析:经过研究发现,即时将Platform文件......
  • 达梦空格填充导致违反唯一约束问题排查及处理
    在oracle迁移到达梦过程中,创建主键提示违法唯一约束。如下所示:用户反馈没有重复数据原因是达梦空格填充模式参数(BLANK_PAD_MODE)为0 , 查询语句将忽略字符串的后缀空格,由于大部分其他都已经迁移过去,只有个别表报错,不能重新初始化实例,需要将有问题的数据查找出来删除查找重......
  • 如何解决win11扩展属性不一致问题(华硕天选3笔记本)
    1.笔者出现该问题的原因:今天上午笔者被迫更新win11,在更新途中,笔者突然好奇更新强制关机会有什么问题呢?这一关重新启动后就出问题了,发现的问题如下:1.1:点击这种类型(就是图标右下角有个盾牌框)的文件会卡一下然后弹出错误框(大概内容)"C:\Users\ASUS\Desktop\*******"文件扩展......
  • 关于动态库加载问题
    1,GetProcAddress只能加载与函数名一致的符号,如果是C++符号是无法加载函数的所以在进行动态库加载时候,如果被加载的库是C++组件,需要将接口声明添加extern“C”或者增加def文件;否则会出现GetProcAddress加载动态函数时候失败;2,查看动态库是否有符号可以使用depend工具:http://w......
  • 通过 Tampermonkey 实现学习通全自动刷课
    在学习过程中,自动化工具能大大提升学习效率。Tampermonkey作为一款流行的用户脚本管理器,提供了丰富的脚本库,用户可以直接获取和使用现成的脚本。本文将详细介绍如何通过Tampermonkey的脚本库,实现学习通的全自动刷课。注意事项请勿开倍速!开启倍速播放会清空学习记录,请使用1......
  • 算法设计与分析(数字塔问题
    目录题目——动态规划求解数字塔问题问题描述代码实现输出结果注意事项小结:题目——动态规划求解数字塔问题在这篇博客中,我们将探讨一个经典的动态规划问题:在一个金字塔形状的数字矩阵中,如何找到从顶部到底部的最大路径和。每次只能向下移动到相邻的数字,最终我们需要计算出这一最......
  • vscode解决运行程序无法从控制台输入问题
    在vscode中运行一些简单的程序代码,需要从控制台接受输入参数,发现不能通过键盘输入。本章教程,提供该问题的解决方法。解决办法由于我是使用的CodeRunner这个插件,CodeRunner插件支持运行多种编程语言,很方便。打开CodeRunner的插件设置,找到一下选项,并勾选即可解决该问题。如果遇......
  • 调查一个osd的rocksdb问题
    开始喜欢ceph的话欢迎关注奋斗的cepher微信公众号阅读更多好文!关于osd的问题总是各种各样,奇奇怪怪,有bug相关的,也有环境相关的,或者是配置相关的,对于osd各种问题的处理,重点在思路,思路对了,问题就好解决了。本篇是一个集群有ssd的osd发生down,这本不是什么值得关注的事,osd的do......
  • 记一次pycharm在使用git提交时需要输入ssh key的密码的问题
    问题描述:从gitlab上拉取了一份代码,长时间为动过,偶然一次提交时发现居然需要输入密码,我试了登录密码和常用密码都报错,无法提交代码 解决方案:1.选择菜单栏的git--管理远程 2.更新远程URL将url更新为git仓库右上角clone里面的http的地址,然后确认即可  3.继续你的......
  • 双token三验证Java实现(解决单token可能存在的问题)
    1.单token存在的问题在正常的业务中,我们经常用到JWT生成单token进行后续的请求验证,但该模式有没有存在什么问题吗?其实是有问题的,主要是token有效期设置长短的问题,如果设置的比较短,用户会频繁的登录,如果设置的比较长,会不太安全,因为token一旦被黑客截取的话,就可以通过此tok......