2023-06-29:redis中什么是热点Key?该如何解决?

news2025/2/22 2:59:31

2023-06-29:redis中什么是热点Key?该如何解决?

答案2023-06-29:

在Redis中,经常被访问的key被称为热点key。

产生原因和危害

原因

热点key问题产生的原因可以归纳为以下两种情况:

用户对于某些数据的访问频率远大于数据的生产频率,这类数据包括热门商品、热点新闻、热点评论以及明星直播等。

在日常工作生活中,突发事件(如双十一期间商品降价促销)可能导致某些热门商品被大量点击浏览或购买,产生了巨大的需求量。类似地,热点新闻、热点评论和明星直播等引起大量刊发和浏览的情况也是典型的读多写少场景,它们会产生热点问题。

请求集中在分片集群中,超过单个服务器的性能极限。在服务端进行数据访问时,通常会对数据进行分片切分,其中某个服务器上的热点Key访问量超过了其承载能力的极限,从而导致热点Key问题的出现。

危害

1、流量集中,超过物理网卡的处理能力上限。

2、请求过多,导致缓存分片服务崩溃。

3、数据库击穿,引发业务雪崩。

发现热点key

预估发现

针对业务,可以提前预估出访问频繁的热点Key,例如在秒杀商品业务中,秒杀商品就是热点Key的典型案例。

然而,并非所有业务都容易预估出热点Key,有时可能会出现对热点Key的遗漏或预估错误的情况。

客户端发现

客户端实际上是离"热点Key"最近的位置,因为Redis命令是由客户端发送的。以Jedis为例,在核心命令入口处使用Google Guava中的AtomicLongMap可以方便地记录热点Key的访问情况,示例如下:

然而,使用客户端进行热点Key的统计也存在一些问题:

(1) 无法预知热点Key的数量,可能存在内存泄露的风险。

(2) 在不同的客户端代码中需要维护此逻辑,可能增加维护成本。

(3) 在规模化汇总方面的实现相对复杂。

Redis发现

monitor命令

使用Redis的monitor命令,可以监控到Redis执行的所有命令。通过解析monitor的结果,我们可以统计一段时间内的热点Key排行榜、命令排行榜以及客户端分布等数据。这种方法能够提供更详细的信息,帮助我们深入了解Redis的使用情况。需要注意的是,在生产环境中使用monitor命令可能对性能产生一定的影响,因此应该谨慎使用,并注意网络开销和输出缓冲区的消费速度。

image.png

Redis-Faina是Facebook开源的一款使用Python语言实现的工具。它利用上述原理可以获取最近10万条命令的热点Key、热点命令以及命令执行的耗时分布等数据。为了减少网络开销并提高输出缓冲区的消费速度,Redis-Faina会尽可能地在本机执行monitor命令。使用Redis-Faina可以更详细地了解Redis的使用情况。需要注意,在生产环境中使用该工具时应考虑性能影响和安全性。

此种方法存在两个问题:

1、在高并发条件下,使用monitor命令会导致内存暴增,同时可能影响Redis的性能。因此,这种方法适合在短时间内使用,而不适合长时间或高并发的监控。

2、monitor命令只能统计单个Redis节点的热点key,对于Redis集群,需要进行汇总统计才能获取全集群的热点key信息。

可以参考的框架:Facebook开源的redis-faina正是利用上述原理使用Python语言实现的

hotkeys

Redis在版本4.0.3中为redis-cli提供了--hotkeys选项,用于方便地找到热点key。通过使用该选项,我们可以快速获取到Redis中的热点key信息。这个功能的引入为我们在分析和优化Redis性能时提供了更方便和直接的工具。需要注意的是,确保Redis版本符合要求,并使用适当的命令行选项来获得所需的热点key信息。

image.png

如果发生错误,确保先将内存逐出策略设置为allkeys-lfu或者volatile-lfu,否则可能会返回错误。

image.png

image.png

然而,如果键值非常多,执行此操作可能会变得相对较慢,这与热点的概念有些相悖。此外,热度的定义可能不够准确。

抓取TCP包发现热点key

Redis客户端使用TCP协议与服务端进行交互,通信协议采用RESP。可以通过对机器上所有Redis端口的TCP数据包进行抓取来完成热点key的统计。这种方法对Redis客户端和服务端没有侵入,是一种较完美的方案。然而,存在以下三个问题:

1.需要进行一定的开发工作。

2.对于高流量的机器抓包,可能会对机器网络产生干扰,并可能丢包。

3.维护成本较高。

为了解决这些问题,有一些开源方案如ELK(ElasticSearch, Logstash, Kibana)体系下的packetbeat插件可以实现Redis、MySQL等服务的数据包抓取、分析和报表展示。

处理热点key

发现热点key后,可以采取以下方法进行处理:

  1. 使用二级缓存:使用Guava Cache或HCache将热点key加载到JVM中作为本地缓存。访问这些key时,直接从本地缓存获取数据,避免直接访问Redis层,有效保护缓存服务器。

  2. key分散:将热点key分散为多个子key,并分别存储在缓存集群的不同机器上。这些子key的值与热点key相同。当通过热点key查询数据时,通过某种哈希算法随机选择一个子key,然后再访问缓存机器,将热点key分散到多个子key上。

请注意,以上只是几种处理热点key的方法,根据实际需求和系统情况,可能还会有其他适合的解决方案。

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

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

相关文章

安卓弹出popup之XPopup

弹窗自己写的话。虽然很简单。但不够丝滑。如果要优雅点的。又要添加动画。但是。。。如果用上了XPopup,动画别人帮你写。爽不爽?丝滑不丝滑。。? 丝滑第一步。先引入依赖 implementation com.github.li-xiaojun:XPopup:2.9.19如果没有这些…

git版本回退操作

本文 git 相关命令: git reset:回退版本,可指定某一次提交的版本。git reset [--soft | --mixed | --hard] commitId。git revert:撤销某个提交,做反向操作,生成新的commitId,原有提交记录保留…

基于java+swing+mysql图书管理系统V7.0

基于javaswingmysql图书管理系统V7.0 一、系统介绍二、功能展示1.项目骨架2.数据库表3.项目内容4.主界面5.登陆6、借阅管理7、修改读者信息8、图书验收9、新书订购 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型:Java SE项目(awtswing&…

(四)python实战——Sqlite3数据库表的增、删、查、改操作案例

前言 Sqlite3是一个轻量级的数据库,本节内容我们介绍一下如何在python环境中使用Sqlite数据库,完成数据库表的简单增、删、查、改操作。开始本节内容之前,我们需要先安装好python环境,我们使用的是python3的环境。 正文 ①创建…

【Docker】利用Dockerfile制作个人的镜像文件详细讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…

如何避免死锁--方法三--scoped_lock

scoped_lock是c17新增的一种模板&#xff0c;也是RAII模式。其是可变参数&#xff0c;可以接受各种互斥类型作为参数模板&#xff0c;可以指定多个互斥量。 前文中我们说到&#xff0c;lock可以锁定多个互斥量&#xff0c;scoped_lock也可以做到。 void thread1() {cout <&…

【网络互联设备】网络杂谈(15)之网桥、路由器、网关、集线器、交换机、中继器的作用与概念

涉及知识点 网桥、路由器、网关、集线器、交换机、中继器的作用与概念&#xff0c;常见的网络互联设备&#xff0c;什么是网桥、路由器、网关、集线器、交换机、中继器。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不…

STM32F103基于HAL工程挂载FatFS驱动SD卡实现IAP功能

STM32F103基于HAL工程挂载FatFS驱动SD卡实现IAP功能 &#x1f3ac;基于SD卡IAP升级演示&#xff1a; &#x1f4cd;相关篇《STM32F103基于HAL工程挂载FatFS驱动SD卡》 &#x1f4cc;《使用STM32F103的串口实现IAP程序升级功能》 &#x1f449;&#x1f3fb;ST相关文档&…

并发-JMM-CPU缓存一致性协议MESI

回顾 指令重排 第一V读&#xff0c;都不能指令重排&#xff1b;第二个V写&#xff0c;都不能指令重排 普通读写&#xff0c;写读都会发生指令重排&#xff0c;V写普通读写会发生指令重排&#xff0c;普通读写V读会发生指令重排 CPU缓存一致性协议MESI java—》cpu的执行过程…

Three.js教程:高光网格材质Phong

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 高光网格材质Phong 高光网格材质MeshPhongMaterial和基础网格材质MeshBasicMaterial、漫反射网格材质MeshLambertMaterial一样都是网格模型的Mesh的材质。 高光网格材质MeshPho…

Web测试的主要内容和测试方法有哪些?

Web测试的主要内容&#xff1a; 一、输入框 二、搜索功能 三、增加、修改功能 四、删除功能 五、注册、登录模块 六、上传图片测试 七、查询结果列表 八、返回键检查 九、回车键检查 十、刷新键检查 Web测试的测试方法&#xff1a; 1.在测试时&#xff0c;与网络有关的步骤或者…

npm报错(npm ERR! Unexpected token ‘.‘)

使用 nvm 将 node 切换到高版本后&#xff0c;运行 npm 相关的命令报的这个错 解决办法&#xff1a; 1、通过nvm list 命令查看当前都安装的node版本列表&#xff0c;依次通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [version] 代表 node 版本号。 2…

目标检测 pytorch复现Yolov4目标检测项目

目标检测 pytorch复现Yolov4目标检测项目 YOLOV4介绍YOLOV4结构解析1、主干特征提取网络Backbone2、特征金字塔3、YoloHead利用获得到的特征进行预测4、预测结果的解码 YOLOV4的训练1、YOLOV4的改进训练技巧2、loss组成 训练自己的YoloV4模型 YOLOV4介绍 YOLOV4结构解析 1、主…

官宣了!B站将以视频播放分钟数代替播放次数

6月26日&#xff0c;哔哩哔哩&#xff08;以下简称“B站”&#xff09;迎来了14周年庆。B站董事长兼CEO陈睿进行了以“很高兴遇见你”为主题的演讲。 在B站14岁的时候&#xff0c;陈睿就演讲向大家宣布&#xff1a;为了更好地挖掘B站的优质内容&#xff0c;B站将以播放分钟数替…

pyocd打包为exe后调用弹黑窗及pyocd的api调用的问题

打包为exe的程序中调用了cmd窗口&#xff0c;调用的时候会自动弹窗&#xff0c;这个弹窗用pyinstaller的-w的方法是不行的&#xff0c;参考RT-ThreadStudio的方法是如下图写一个.bat文件&#xff0c;关闭弹窗回显 echo off cd /D %~dp0 pyocd.exe %* 但一个原因是 它是0.1.1版…

git的指令

rebase 首先在master上切出一个新分支&#xff0c;叫dev 在dev上进行开发xxx 此时master上被他人提交了东西 想把这个master提交的东西移到dev上 最后统一合并到master上 步骤&#xff1a; 1.master上进行pull&#xff0c;确保本地是最新的 2.在dev上输入git rebase master …

【综合布线设计】网络杂谈(18)深入了解综合布线系统设计

涉及知识点 什么是综合布线系统设计&#xff0c;综合布线系统设计的原则&#xff0c;工作区子系统设计&#xff0c;水平子系统设计&#xff0c;垂直子系统设计&#xff0c;管理子系统设计&#xff0c;设备间子系统设计&#xff0c;建筑群子系统设计。深入了解综合布线系统设计…

二叉树OJ题:LeetCode--226.翻转二叉树

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第226道二叉树OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

你真的学懂if语句了嘛,看完这篇文章你一定会让你有所收获,彻底玩转if语句!

&#x1f4cc;(,&#xff65;∀&#xff65;)&#xff89;゛hello ,欢迎来到鸽芷咕的个人频道。 &#x1f4dc; 本博主是C/C领域的新星作者&#xff0c;平时喜欢分享一些编程经验和学习中的遇到的难题&#xff0c;喜欢不要忘了关注咯&#xff01; ✅ 鸽芷咕&#xff1a; 个人…

Arrays类 (Java)

文章目录 1. 介绍2. 分析3. 方法3.1 toStriing()方法3.2 sort()方法 1. 介绍 A. 类介绍&#xff1a;  此类包含用来操作数组&#xff08;比如排序和搜索&#xff09;的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂. 2. 分析 A. 类包结构&#xff1a;java.uti…