Redis Hotkey?3招定位+5招解决

作者总结分享 Redis Hotkey 定位和解决方法的优缺点。

作者:贲绍华,爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 800 字,预计阅读需要 2 分钟。

什么是 Hotkey,会有什么问题?

1.1 什么是 Hotkey?

顾名思义即 Redis 实例中的热点数据,当客户端频繁访地查询、读取、写入同一个 key 时,它被称之为 Hotkey。

1.2 会有什么问题?

1.2.1 网络问题

单机的资源是有限的,Hotkey 无法充分利用集群分担流量时,会导致各实例间资源无法充分合理应用。

Hotkey 所属实例的网卡也会持续高负载的状态,可能会出现相应延迟的问题。

1.2.2 缓存穿透

当 Hotkey 失效或所在节点实例状态异常时,流量请求会直接打到数据库上。

1.2.3 主从同步延迟

在 Redis 中,主从同步是异步进行操作的,但如果单节点 Hotkey 持续占用过高的带宽资源,则可能会造成主从延迟或中断。

如何发现 Hotkey?

2.1 客户端统计

这里的客户端可以是具体的业务端,也可以是 proxy 层,根据 key 的调用情况进行统计与分析。

优点

  • 实现成本相对较低。
  • 可以根据统计情况灵活调整客户端的统计指标与算法,灵活配置客户端缓存。

缺点

  • 对业务开发的侵入性:需要预先埋点,添加相关逻辑和代码。这涉及到对业务开发的改动和调整,可能增加开发复杂性和维护成本。
  • 监测存在延迟:多个客户端统计时汇总分析比较繁琐,上报与分析的过程往往并不是实时的,存在一定的延迟。

    2.2 Monitor 监控

    Redis 提供了 Monitor 监控命令,使用 Monitor 命令可以实时监控 Redis 数据库的所有命令操作,包括对 Hotkey 的读取和写入操作,通过对返回的执行命令进行统计来分析 Hotkey 的分布。

方案推荐

Facebook 开源的 redis-faina(Python),提供了对 Monitor 的一些分析与定位。

优点

  • 可以清楚的知道 key 的操作行为(写入还是读取)。
  • 准确定位客户端来源。

缺点

  • Monitor 命令本身会影响 Redis 的性能,特别是在高负载环境中。它会占用部分 Redis 服务器的 CPU 资源和网络带宽,在 Redis 官方文档 中描述如下,运行单个 Monitor 客户端可能会使吞吐量减少50%以上:
In this particular case, running a single 
MONITOR client can reduce the throughput by more than 50%. Running more 
MONITOR clients will reduce throughput even more

2.3 Hotkeys

从 Redis 4.0.3 版本开始,Redis 引入了 hotkeys 的命令来帮助定位 Hotkey。该命令可用于识别在 Redis 数据库中访问频率最高的键。

对性能要求不是太高的业务场景下,建议使用该进行 Hotkey 的定位与分析。使用前需要先配置 Redis 的内存淘汰策略。

优点

  • 易用性:内置命令直接调用即可。
  • 实时性:该命令提供的信息是实时的,能够及时反映当前的热点键。

    缺点

  • 性能影响:由于它是一个全量的Hotkey数据,特别是存在大量hotkey的场景下会对性能产生较大影响,因此不推荐在生产环境频繁执行;
  • 局限性:该命令返回的结果是基于Redis自身内部的采样与统计算法,根据机器资源的或预期场景的不同,该结果可能并不是100%符合预期的;
  • 完整性:该命令只提供了热点键的基本信息,无法知道更详细的统计和分析信息,需要向业务侧确认;

2.4 TCP 抓包

使用这种方式可以做到对业务端无侵入性、对 Redis 实例本身性能无影响。

方案推荐

ELK 提供了一个名为 packetbeat 的抓包插件,可以对 Redis 的 TCP 报文进行抓包与分析。但往往需要搭配 ELK 一起使用,单独使用 packetbeat 插件的话也需要额外做一些定制化变更。

优点

  • 实时性:可以实时捕获 Redis 客户端与 Redis 服务器之间的网络通信,包括请求和响应数据,以获取最新的 Hotkey 信息。
  • 适用范围更广:适用于任何 Redis 实例,不论是单机还是分布式部署,无论是云上还是本地。只要网络流量可以访问,就可以使用 TCP 抓包进行分析。
  • 独立性:这种方式是独立于业务侧与 Redis 实例之外的,无需业务埋点、无需更改或配置 Redis,同时也避免对 Redis 实例所在的机器性能造成额外的负担。

    缺点

  • 复杂度过高:无论是基于自行实现还是 packetbeat,都需要进行一定的定制化调整,使用成本相对较高。
  • 稳定性:当网络环境不稳定时,该方式可能存在一定误差。
  • 隐私与安全:TCP 报文包含了完整都的请求和响应数据可能会涉及到敏感信息的泄露(如密码、敏感数据等)。

如何解决?

3.1 Redis cluster 数据分片

将数据按照一定的规则进行分片存储,使不同的键分散在不同的 Redis 实例或分片中。这样可以减少单个实例的负载,提高整体性能。

可以使用 Redis Cluster 来实现分片,或者结合应用程序的逻辑进行手动分片。但该方式可能并不适用单个或少量 key 为 Hotkey 的场景。

3.2 多级缓存

通过第二小节的方式定位到 Hotkey 后,可以对 Hotkey 灵活调整缓存策略,比如客户端本地+分布式缓存、全局缓存+局部缓存等。

3.3 监控优化

对Redis实例所在机器完善监控与告警,多维度分析 Hotkey 场景下机器的 QPS、内存、网络等资源的使用情况。

当达到策略阈值时,可以配合自动化运维增加一些如:扩容、调整缓存配置、slot迁移等策略。

3.4 根据业务拆分子 key

该方式适用于 key 的数量较少且可以对 key 或 value 自身进行拆分的情况,令 Hotkey 尽量分散的落到不同的实例上。

3.5 缓存策略与 TTL 优化

合理配置 TTL,并使用适当的缓存策略,如 LRU(Least Recently Used)或 LFU(Least Frequently Used),以便自动淘汰冷数据并保留热点数据。

避免 Hotkey 过期导致频繁的缓存击穿的情况。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言:简单的用二维数组打印杨氏三角

杨辉三角&#xff0c;又称帕斯卡三角&#xff0c;是一个数学上的规律图形。它的构造规则如下&#xff1a; 每一行的两个端点数字是1。从第三行开始&#xff0c;每个数字是它上方两个数字的和。每一行数字左右对称。 #include<stdio.h> int main() {int arr[50][50];//定…

Windows server 2012 R2系统服务器远程桌面服务激活服务器RD授权分享

Windows server 2012 R2系统服务器远程桌面服务激活服务器RD授权 二、激活服务器&#xff0c;获取许可证服务器ID和许可证密钥包ID三、激活终端服务器四、配置远程桌面会话主机授权服务器 上期我分享了Windows server 2012 R2系统服务器远程桌面服务的安装教程&#xff0c;若是…

贪吃蛇游戏和俄罗斯方块

一、创建新项目 创建一个新的项目&#xff0c;并命名。 创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类&#xff0c; 创建一个com.xxx.controller的包用来存放启动的入口类(控制类) package …

java初探之代理模式

代理模式 代理模式一般有三种角色&#xff1a; 没有使用代理模式的话可能就会直接去操作真实的对象 加入代理模式就是加入了 隔离 把我们的真实对象与调用者隔离了一下(代理对象) 代理对象的好处&#xff1f; 使用者(client)跟真实的对象是没有直接的交集的。不会直接操作到…

C++二分查找算法:132 模式解法二枚举2

题目及解法一&#xff1a; https://blog.csdn.net/he_zhidan/article/details/134362273 分析 第一步&#xff0c;选择各3对应的1&#xff0c;如果有多个符合对应最小的1&#xff0c;记录num[0,j)中的最小值iMin&#xff0c;如果nums[j]大于iMin&#xff0c;则m3To1 [nums[j…

开源博客项目Blog .NET Core源码学习(6:雪花算法)

Blog .NET项目中有多种数据类生成对象实例时需要唯一标识&#xff0c;一般做法要么使用GUID&#xff0c;也可以保存到数据库时使用数据库表的自增长ID&#xff0c;也可以自定义规则以确保产生不重复的唯一标识&#xff0c;而在Blog .NET项目中使用雪花算法生成唯一标识。   关…

windows安装maven,配置环境变量

官网下载&#xff1a; 其他版本找 Other Releases 配置环境变量 1、解压缩之后开始配置环境变量 2、右键此电脑&#xff0c;选中属性->高级系统设置->高级->环境变量。 3、①和②任选一个都可 ①在系统变量那边增加MAVEN_HOME&#xff0c;路径是解压缩后的文件路径。…

asp.net数字档案管理系统VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net 数字档案管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发。 asp.net数字档案系统1 应用技…

C进阶---字符函数和字符串函数

目录 一、长度不受限限制的字符串函数 1.1strlen 1.2strcpy 1.3strcat 1.4strcmp 二、长度受限制的字符串函数 2.1strncpy 2.2strncat 2.3strncmp 三、其他字符串函数 3.1strstr 3.2strtok 3.3sterror 3.4memcpy 3.5memmove 3.6memcmp 四、字符分类函…

【Java】详解多线程同步的三种方式

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;等风来&#xff0c;不如追风去 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 一.&#x1f510;线…

如何使用postman调用若依系统接口(报错401,认证失败,无法访问系统资源)

有时候我们想使用postman调用若依接口&#xff0c;会报下面的401错误&#xff0c;认证失败&#xff0c;无法访问系统资源。 原因是请求中没有token&#xff0c;没法通过若依的权限认证&#xff0c;下面来说一下如何解决。 {"msg": "请求访问&#xff1a;/syste…

物联网主机E6000:动环监控的新革命

多协议、多接口的全能主机 在物联网时代&#xff0c;数据的采集和处理已经成为了企业运营的重要环节。而物联网主机E6000&#xff0c;就是这个时代的全能选手。它支持多种协议和接口&#xff0c;无论是视频、设备还是DCS系统的数据&#xff0c;都能轻松接入并进行采集处理。这种…

基于SpringBoot的教务管理系统

基于SpringBoot的教务管理系统 教务管理系统开发技术功能模块代码结构运行截图数据库源码获取 教务管理系统 欢迎访问此博客&#xff0c;是否为自己的毕业设计而担忧呢&#xff1f;是否感觉自己的时间不够做毕业设计呢&#xff1f;那你不妨看一下下面的文章&#xff01; 开发…

从房地产先后跨界通信、文旅演艺领域,万通发展未来路在何方?

近年来&#xff0c;房地产市场可谓负重前行&#xff0c;各大房企纷纷谋求新出路。 作为中国最早的房企之一&#xff0c;万通发展再次处在转型变革的十字路口。自去年以来&#xff0c;万通发展在转型升级之路上动作频频&#xff0c;可谓忙得不亦乐乎。 大幕落下之时&#xff0c;…

【word密码】word设置只读方式的四个方法

想要将word文档设置为只读模式&#xff0c;方法有很多&#xff0c;今天小奥超人介绍几个方法给大家。 方法一&#xff1a;文件属性 常见的、简单的设置方法&#xff0c;不用打开word文件&#xff0c;只需要右键选择文件&#xff0c;打开文件属性&#xff0c;勾选上【只读】选…

Java多线程之CAS及原子操作

一、CAS是什么&#xff1f; Java 并发机制实现原子操作有两种&#xff1a; 一种是锁&#xff0c;还有一种是CAS。 在Java中&#xff0c;锁在并发处理中占据了一席之地&#xff0c;但是使用锁有一个不好的地方&#xff0c;就是当一个线程没有获取到锁时会被阻塞挂起&…

35 _ Trie树:如何实现搜索引擎的搜索关键词提示功能?

搜索引擎的搜索关键词提示功能,我想你应该不陌生吧?为了方便快速输入,当你在搜索引擎的搜索框中,输入要搜索的文字的某一部分的时候,搜索引擎就会自动弹出下拉框,里面是各种关键词提示。你可以直接从下拉框中选择你要搜索的东西,而不用把所有内容都输入进去,一定程度上…

OpenCV入门2——图像视频的加载与展示一些API

文章目录 题目OpenCV创建显示窗口OpenCV加载显示图片题目 OpenCV保存文件利用OpenCV从摄像头采集视频从多媒体文件中读取视频帧将视频数据录制成多媒体文件OpenCV控制鼠标关于[np.uint8](https://stackoverflow.com/questions/68387192/what-is-np-uint8) OpenCV中的TrackBar控…

Rust图形界面编程:egui平直布局

文章目录 平直布局with_layout 平直布局 在前面的示例中&#xff0c;已经用到了ui.horizontal用来布局&#xff0c;其特点是水平摆放控件。相应地&#xff0c;ui.vertical则是垂直摆放控件。根据控件的摆放顺序不同&#xff0c;这两个布局组件衍生出一系列布局函数 horizonta…

21 Linux 自带的LED驱动

一、Linux 自带 LED 驱动使能 其实 Linux 内核自带 LED 抢夺那个&#xff0c;但在此之前需要配置 Linux 驱动来使能 LED 驱动。 输入以下命令&#xff1a; cd linux/atk-mpl/linux/my_linux/linux-5.4.31 make menuconfig 根据以下路径找到 LED 驱动&#xff1a; → Device D…