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.rhkb.cn/news/7531.html

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

相关文章

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代&#xff0c;数据如同新时代的石油&#xff0c;蕴含着巨大的价值。从商业决策到科研探索&#xff0c;从城市规划到环境监测&#xff0c;海量数据的高效处理、精准分析与直观可视化&#xff0c;已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…

ThreeJS示例教程200+【目录】

Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…

opengrok_使用技巧

Searchhttps://xrefandroid.com/android-15.0.0_r1/https://xrefandroid.com/android-15.0.0_r1/ 选择搜索的目录&#xff08;工程&#xff09; 手动在下拉框中选择&#xff0c;或者 使用下面三个快捷按钮进行选择或者取消选择。 输入搜索的条件 搜索域说明 域 fullSearc…

无人机如何自主侦察?UEAVAD:基于视觉的无人机主动目标探测与导航数据集

作者&#xff1a;Xinhua Jiang, Tianpeng Liu, Li Liu, Zhen Liu, and Yongxiang Liu 单位&#xff1a;国防科技大学电子科学学院 论文标题&#xff1a;UEVAVD: A Dataset for Developing UAV’s Eye View Active Object Detection 论文链接&#xff1a;https://arxiv.org/p…

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…

Ansible入门学习之基础元素介绍

一、Ansible目录结构介绍 1.通过rpm -ql ansible获取ansible所有文件存放的目录 有配置文件目录 /etc/ansible/ 执行文件目录 /usr/bin/ 其中 /etc/ansible/ 该文件目录的主要功能是 inventory主机信息配置&#xff0c;ansible工具功能配置。 ansible自身的配置文件…

git Bash通过SSH key 登录github的详细步骤

1 问题 通过在windows 终端中的通过git登录github 不再是通过密码登录了&#xff0c;需要本地生成一个密钥&#xff0c;配置到gihub中才能使用 2 步骤 &#xff08;1&#xff09;首先配置用户名和邮箱 git config --global user.name "用户名"git config --global…

矩阵的秩在机器学习中具有广泛的应用

矩阵的秩在机器学习中具有广泛的应用&#xff0c;主要体现在以下几个方面&#xff1a; 一、数据降维与特征提取 主成分分析&#xff08;PCA&#xff09;&#xff1a; PCA是一种常用的数据降维技术&#xff0c;它通过寻找数据中的主成分&#xff08;即最大方差方向&#xff09…

Windows Defender添加排除项无权限的解决方法

目录 起因Windows Defender添加排除项无权限通过管理员终端添加排除项管理员身份运行打开PowerShell添加/移除排除项的命令 起因 博主在打软件补丁时&#xff0c;遇到 Windows Defender 一直拦截并删除文件&#xff0c;而在 Windows Defender 中无权限访问排除项。尝试通过管理…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载&#xff1a;https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址&#xff1a;https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

计算机网络之应用层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 05 应用层 在网上看到其他人做了相关笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 王道考研 计算机网络笔记 第六章&#xff1a;应用层_王道考研 应用层 笔记-CSDN博客 DNS&#x…

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

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

Pyecharts图表交互功能提升

在数据可视化中&#xff0c;交互功能可以极大地提升用户体验&#xff0c;让用户能够更加深入地探索数据。Pyecharts 提供了多种强大的交互功能&#xff0c;本篇将重点介绍如何使用缩略轴组件、配置图例交互&#xff0c;让我们的数据可视化作品更加生动有趣。 一、缩略轴组件使…

奇怪的单词(快速扩张200个单词)

这是一些非常奇怪的单词&#xff1a; screw n.螺丝&#xff1b;螺丝钉 screwdriver n.起子&#xff0c;螺丝刀&#xff0c;改锥 copulation n.连接 copulate a.配合的 bonk n.撞击&#xff1b;猛击 v.轻击&#xff1b;碰撞ebony n.黑檀couple n.夫妇blonde n.金发女郎intimacy…

Ubuntu20.04 深度学习环境配置(持续完善)

文章目录 常用的一些命令安装 Anaconda创建conda虚拟环境查看虚拟环境大小 安装显卡驱动安装CUDA安装cuDNN官方仓库安装 cuDNN安装 cuDNN 库验证 cuDNN 安装确认 CUDA 和 cuDNN 是否匹配&#xff1a; TensorRT下载 TensorRT安装 TensorRT 本地仓库配置 GPG 签名密钥安装 Tensor…

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…

数据结构——堆(C语言)

基本概念&#xff1a; 1、完全二叉树&#xff1a;若二叉树的深度为h&#xff0c;则除第h层外&#xff0c;其他层的结点全部达到最大值&#xff0c;且第h层的所有结点都集中在左子树。 2、满二叉树&#xff1a;满二叉树是一种特殊的的完全二叉树&#xff0c;所有层的结点都是最…

const的用法

文章目录 一、C和C中const修饰变量的区别二、const和一级指针的结合const修饰的量常出现的错误是:const和一级指针的结合总结&#xff1a;const和指针的类型转换公式 三、const和二级指针的结合 一、C和C中const修饰变量的区别 C中&#xff1a;const必须初始化&#xff0c;叫常…

机器学习-线性回归(参数估计之经验风险最小化)

给定一组包含 &#x1d441; 个训练样本的训练集 我们希望能够 学习一个最优的线性回归的模型参数 &#x1d498; 现在我们来介绍线性回归的一种模型参数估计方法&#xff1a;经验风险最小化。 我们前面说过&#xff0c;对于标签 &#x1d466; 和模型输出都为连续的实数值&…

appium自动化环境搭建

一、appium介绍 appium介绍 appium是一个开源工具、支持跨平台、用于自动化ios、安卓手机和windows桌面平台上面的原生、移动web和混合应用&#xff0c;支持多种编程语言(python&#xff0c;java&#xff0c;Ruby&#xff0c;Javascript、PHP等) 原生应用和混合应用&#xf…