Redis 的热 Key(Hot Key)问题及解决方法

Redis 的热 Key(Hot Key)问题及解决方法

1. 什么是 Redis 热 Key?

Redis 热 Key(Hot Key)指的是访问频率极高的 Key,通常会造成以下问题:

  • 单 Key 访问量过大:热点 Key 可能被高并发请求频繁访问,导致单点压力集中,影响 Redis 的性能和稳定性。
  • CPU 负载过高:Redis 需要处理大量对同一 Key 的请求,导致 CPU 使用率急剧上升。
  • 网络 IO 瓶颈:请求量过大可能会导致 Redis 服务器的网络流量激增,影响整体响应速度。
  • 缓存穿透、缓存击穿风险:如果热 Key 过期或者未命中,可能导致大量请求直接打到数据库,引发雪崩效应。

2. 如何发现热 Key?

要优化 Redis 热 Key 问题,首先需要找到这些 Key。可以使用以下方法:

(1)使用 Redis 自带命令

  • `monitor`(不推荐线上使用):

    redis-cli monitor
    

    该命令会实时输出所有 Redis 操作日志,可以用来观察哪些 Key 被频繁访问。

  • `hotkeys`(适用于 Redis 7.0+)

    redis-cli hotkeys
    

    该命令直接列出热点 Key,是 Redis 7.0 之后的新功能。

  • `info commandstats`

    redis-cli info commandstats
    

    该命令可以查看 Redis 命令的执行统计,比如 `get`、`set` 命令的执行次数,可以间接推测哪些 Key 访问频率较高。

(2)使用 Redis 统计日志

  • 开启 Redis 慢查询日志:
    CONFIG SET slowlog-log-slower-than 10000  # 记录执行时间超过 10ms 的命令
    
    然后查看慢查询日志:
    SLOWLOG GET 10
    
    观察是否有特定 Key 被频繁查询。

(3)在应用层收集访问数据

在业务代码中增加访问日志,例如使用 AOP 记录 Redis 访问日志,或者在 Redis 代理层(如 Twemproxy)收集 Key 的访问情况。


3. Redis 热 Key 可能带来的问题

问题类型影响
CPU 负载高单 Key 访问过多,Redis 线程 CPU 使用率高
网络流量大Redis 可能面临巨大的请求流量,影响网络性能
数据库压力高如果热点 Key 失效,可能导致数据库访问量暴增
业务响应变慢Redis 请求延迟增加,影响业务体验

4. Redis 热 Key 解决方案

针对 Redis 热 Key 的问题,可以采取以下几种优化策略:

(1)本地缓存 + Redis 缓存

适用于 热点 Key 访问频繁且数据变动不频繁 的场景。

  • 在应用服务器本地增加一层 Guava CacheCaffeineEhCache 作为短时缓存,避免每次都访问 Redis。
  • 只在缓存未命中时再查询 Redis。

示例:

LoadingCache<String, String> localCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).maximumSize(1000).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) throws Exception {return redisClient.get(key);  // 从 Redis 加载}});

当数据更新时,主动删除本地缓存:

localCache.invalidate("hot_key");

(2)使用多级缓存

适用于分布式集群环境,缓解单点压力:

  • 第一级缓存(应用本地缓存)
  • 第二级缓存(Redis)
  • 第三级缓存(数据库)

示例流程:

  1. 先查本地缓存(Guava Cache)。
  2. 本地缓存未命中,查 Redis。
  3. Redis 未命中,查询数据库并回填 Redis。

(3)Redis 读写分离(主从集群 + 读从库)

适用于 Redis 读流量过高的场景

  • 部署 Redis 主从复制,让多个从节点分担读压力:
    slaveof <master-host> <master-port>
    
  • 使用 Redis 代理(如 Twemproxy、Codis)进行分流,让读请求优先访问从节点。

(4)数据分片(Sharding)

适用于 Redis Key 访问不均衡的场景

  • 将 Key 拆分成多个小 Key,分散访问压力:
    • 例如:`user:123:profile` 拆分成 `user:123:profile:1`,`user:123:profile:2`
  • 结合 Redis Cluster分片代理(Codis、Twemproxy) 让数据均衡分布。

(5)设置合理的 Key 过期策略

适用于热点 Key 频繁访问但过期后可能引发缓存击穿

  • 采用 随机过期时间,避免同时失效:
    EXPIRE hot_key $((60 + RANDOM % 30))
    
  • 采用 自动重建缓存
    • 在 Key 过期前,后台线程提前刷新缓存。

(6)异步更新策略

适用于 缓存数据实时性要求不高,但访问量极大 的情况:

  • 采用 异步写入
    • 访问 Redis 热 Key 时,使用 消息队列(如 Kafka、RabbitMQ) 让后端批量更新数据,避免频繁更新。

(7)热点 Key 预热

适用于 系统启动或热点数据突增的场景

  • 在应用启动时,提前加载热点数据到 Redis,减少初始访问延迟。

示例:

redis-cli -x set hot_key < hot_data.json

5. Redis 热 Key 解决方案对比

方案适用场景优缺点
本地缓存访问频繁但数据变动少低延迟,但数据一致性问题
多级缓存访问量大,数据库访问量大读性能高,但增加复杂度
读写分离读多写少的场景读性能提升,但架构复杂
数据分片访问集中在部分 Key负载均衡好,但实现复杂
Key 过期策略缓存击穿风险高减少缓存穿透,但不适合频繁变更数据
异步更新低实时性需求场景减少 Redis 负担,但一致性受影响
预热业务启动或热点突增预防热点 Key 失效,但维护麻烦

6. 结论

  • 选择合适的方案需要结合 业务场景、数据访问模式 以及 Redis 架构 来做权衡。
  • 最佳实践: 业务+架构结合优化,避免单点过载,提升系统稳定性! 🚀

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

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

相关文章

SSM东理咨询交流论坛

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 js…

http的请求体各项解析

一、前言 做Java开发的人员都知道&#xff0c;其实我们很多时候不单单在写Java程序。做的各种各样的系统&#xff0c;不管是PC的 还是移动端的&#xff0c;还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言&#xff0c;再做业务开发时&#…

gradle生命周期钩子函数

文章目录 0. 总结表格1. 构建初始阶段gradle.settingsEvaluated()gradle.projectsLoaded() 2. 配置阶段gradle.beforeProject()gradle.afterProject()gradle.projectEvaluated()gradle.afterEvaluate()gradle.taskGraph.whenReady 3. 执行阶段gradle.taskGraph.beforeTaskgradl…

Qt Enter和HoverEnter事件

介绍 做PC开发的过程中或多或少都会接触到鼠标的悬停事件&#xff0c;Qt中处理鼠标悬停有Enter和HoverEnter两种事件 相同点 QEvent::Enter对应QEnterEvent&#xff0c;描述的是鼠标进入控件坐标范围之内的行为&#xff0c;QEnterEvent可以抓取鼠标的位置&#xff1b;QEvent…

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸&#xff0c;主要分为以下两种方式&#xff1a; 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞&#xff0c;直接突破容器的隔离机制&#xff0c;获得宿主机的权限。 攻击原理&#xff1a;容器本质上是通过 Linux 的…

如何优化深度学习模型来提高错别字检测准确率?

为了优化深度学习模型以提高错别字检测的准确率,可以从以下几个方面入手: 1. 数据增强 数据增强是提高模型泛化能力的有效方法。通过在训练数据中引入噪声,模型可以学习到更多变的模式,从而提高对未见数据的识别能力。 删除字符:以一定概率删除文本中的一个字符。增加字…

二叉搜索树中的搜索(力扣700)

首先介绍一下什么是二叉搜索树。 二叉搜索树是一个有序树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉…

pytest自动化测试 - 构造“预置条件”的几种方式

<< 返回目录 1 pytest自动化测试 - 构造“预置条件”的几种方式 1.1 使用夹具构造预置条件 在夹具章节中&#xff0c;我们介绍了夹具的作用&#xff0c;其中一项就是构造预置条件。pytest.fixture装饰器中如果测试数据使用yield返回&#xff0c;则yield前的语句为预置条…

微信小程序date picker的一些说明

微信小程序的picker是一个功能强大的组件&#xff0c;它可以是一个普通选择器&#xff0c;也可以是多项选择器&#xff0c;也可以是时间、日期、省市区选择器。 官方文档在这里 这里讲一下date picker的用法。 <view class"section"><view class"se…

[java] 面向对象进阶篇1--黑马程序员

目录 static 静态变量及其访问 实例变量及其访问 静态方法及其访问 实例方法及其访问 总结 继承 作用 定义格式 示例 总结 子类不能继承的内容 继承后的特点 成员变量 成员变量不重名 成员变量重名 super访问父类成员变量 成员方法 成员方法不重名 成员方法…

python3+TensorFlow 2.x 基础学习(一)

目录 TensorFlow 2.x基础 1、安装 TensorFlow 2.x 2、TensorFlow 2.x 基础概念 2、1 Eager Execution 2、2 TensorFlow 张量&#xff08;Tensor&#xff09; 3、使用Keras构建神经网络模型 3、1 构建 Sequential 模型 3、2 编译模型 1、Optimizer&#xff08;优化器&a…

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布

1、OpenAI 的安全疏忽&#xff1a;ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞&#xff1a;攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求&#xff0c;利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…

openlava/LSF 用户组管理脚本

背景 在openlava运维中经常需要自动化一些常规操作&#xff0c;比如增加用户组以及组成员、删除用户组成员、删除用户组等。而openlava的配置文件需要手动修改&#xff0c;然后再通过badmin reconfig激活配置。因此开发脚本将手工操作自动化就很有必要。 通过将脚本中的User…

LLMs的星辰大海:大语言模型的前世今生

文章目录 一. LLM 的演进&#xff1a;从规则到智能的跃迁 &#x1f4ab;1.1 语言模型的蹒跚起步 &#x1f476;1.2 RNN 与 LSTM&#xff1a;序列建模的尝试 &#x1f9d0;1.3 Transformer 的横空出世&#xff1a;自注意力机制的革命 &#x1f4a5;1.4 LLM &#xff1a;从预测到…

7-Zip高危漏洞CVE-2025-0411:解析与修复

7-Zip高危漏洞CVE-2025-0411&#xff1a;解析与修复 免责声明 本系列工具仅供安全专业人员进行已授权环境使用&#xff0c;此工具所提供的功能只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利…

数据结构(精讲)----树(应用篇)

特性&#xff1a; 什么是树&#xff1a; 树(Tree)是(n>0)个节点的有限集合T&#xff0c;它满足两个条件&#xff1a; (1) 有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点。 (2) 其余的节点可以分为m&#xff08;m≥0&#xff09;个互不相交的有限集合T1、…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…

如何确保Spring单例Bean在高并发环境下的安全性?

在Spring中&#xff0c;单例Bean就像是一个“公共的水杯”&#xff0c;整个应用程序中的所有线程都会共享这一个实例。在大部分情况下&#xff0c;这没什么问题&#xff0c;但如果多个线程同时想要修改这个“水杯”里的内容&#xff0c;就可能会出现问题了。 想象一下&#xff…

期刊审稿意见回复的LaTeX模板分享

下载网址 https://github.com/NeuroDong/Latex_for_review_comments 效果展示 分享内容 在学术写作过程中&#xff0c;回复审稿意见是一个重要且繁琐的环节。由于审稿人众多&#xff0c;使用Word进行排版往往效率低下。为了提高效率&#xff0c;我在网上找到了一个LaTeX模板…

Vue 3 30天精进之旅:Day 03 - Vue实例

引言 在前两天的学习中&#xff0c;我们成功搭建了Vue.js的开发环境&#xff0c;并创建了我们的第一个Vue项目。今天&#xff0c;我们将深入了解Vue的核心概念之一——Vue实例。通过学习Vue实例&#xff0c;你将理解Vue的基础架构&#xff0c;掌握数据绑定、模板语法和指令的使…