Redis的热key解决

1、Redis热Key会带来哪些问题

1、流量集中,达到物理网卡上限。

当某一热点 Key 的请求在某一主机上超过该主机网卡上限时,由于流量的过度集中,会导致服务器中其它服务无法进行。

2、请求过多,缓存分片服务被打垮。

如果热点过于集中,热点 Key 的缓存过多,超过目前的缓存容量时,就会导致缓存分片服务被打垮现象的产生。

3、DB 击穿,引起业务雪崩。

当缓存服务崩溃后,此时再有请求产生,会缓存到后台 DB 上,由于DB 本身性能较弱,在面临大请求时很容易发生请求穿透现象,会进一步导致雪崩现象,严重影响设备的性能。

二、如何解决热Key问题

目前业内的方案有两种 (1)利用二级缓存 比如利用ehcache,或者一个HashMap都可以。在你发现热key以后,把热key加载到系统的JVM中。 针对这种热key请求,会直接从jvm中取,而不会走到redis层。 假设此时有十万个针对同一个key的请求过来,如果没有本地缓存,这十万个请求就直接怼到同一台redis上了。 现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,然后返回数据。避免了十万个请求怼到同一台redis上的情形。 (2)备份热key 这个方案也很简单。不要让key走到同一台redis上不就行了。我们把这个key,在多个redis上都存一份不就好了。接下来,有热key请求进来的时候,我们就在有备份的redis上随机选取一台,进行访问取值,返回数据。 假设redis的集群数量为N,步骤如下图所示

注:不一定是2N,你想取3N,4N都可以,看要求。 伪代码如下

constM = N * 2
//生成随机数
random = GenRandom(0, M)
//构造备份新key
    bakHotKey = hotKey + “_” + randomdata = redis.GET(bakHotKey)ifdata == NULL {
    data = GetFromDB()
    redis.SET(bakHotKey, expireTime + GenRandom(0,5))
}

业内方案

OK,其实看完上面的内容,大家可能会有一个疑问。

烟哥,有办法在项目运行过程中,自动发现热key,然后程序自动处理么?

嗯,好问题,那我们来讲讲业内怎么做的。其实只有两步 (1)监控热key (2)通知系统做处理 正巧,前几天有赞出了一篇《有赞透明多级缓存解决方案(TMC)》,里头也有提到热点key问题,我们刚好借此说明 (1)监控热key 在监控热key方面,有赞用的是方式二:在客户端进行收集。 在《有赞透明多级缓存解决方案(TMC)》中有一句话提到

TMC 对原生jedis包的JedisPool和Jedis类做了改造,在JedisPool初始化过程中集成TMC“热点发现”+“本地缓存”功能Hermes-SDK包的初始化逻辑。

也就说人家改写了jedis原生的jar包,加入了Hermes-SDK包。 那Hermes-SDK包用来干嘛? OK,就是做热点发现本地缓存。 从监控的角度看,该包对于Jedis-Client的每次key值访问请求,Hermes-SDK 都会通过其通信模块将key访问事件异步上报给Hermes服务端集群,以便其根据上报数据进行“热点探测”。

当然,这只是其中一种方式,有的公司在监控方面用的是方式五:自己抓包评估。 具体是这么做的,先利用flink搭建一套流式计算系统。然后自己写一个抓包程序抓redis监听端口的数据,抓到数据后往kafka里丢。 接下来,流式计算系统消费kafka里的数据,进行数据统计即可,也能达到监控热key的目的。

(2)通知系统做处理 在这个角度,有赞用的是上面的解决方案一:利用二级缓存进行处理。 有赞在监控到热key后,Hermes服务端集群会通过各种手段通知各业务系统里的Hermes-SDK,告诉他们:"老弟,这个key是热key,记得做本地缓存。" 于是Hermes-SDK就会将该key缓存在本地,对于后面的请求。Hermes-SDK发现这个是一个热key,直接从本地中拿,而不会去访问集群。

除了这种通知方式以外。我们也可以这么做,比如你的流式计算系统监控到热key了,往zookeeper里头的某个节点里写。然后你的业务系统监听该节点,发现节点数据变化了,就代表发现热key。最后往本地缓存里写,也是可以的。

通知方式各种各样,大家可以自由发挥。本文只是提供一个思路。

参考文献:

https://www.cnblogs.com/rjzheng/p/10874537.html

https://juejin.cn/post/7010231093664153613

Redis 热 Key 发现以及解决办法 | 董宗磊的博客--靡不有初,鲜克有终

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

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

相关文章

深入理解缓冲区:提升程序性能的关键

深入理解缓冲区:提升程序性能的关键 1、什么是缓冲区?2、缓冲区的作用3、缓冲区在Java中的应用4、如何操作缓冲区5、总结 💖The Begin💖点点关注,收藏不迷路💖 缓冲区(Buffer)是一种…

mac电脑pdf合并,macpdf合并成一个pdf

在数字化办公和学习的今天,pdf文件因其跨平台兼容性强、格式稳定而成为了最受欢迎的文档格式之一。但随之而来的问题也接踵而至,如何将多个pdf文件合并为一个?这不仅关系到文档的整洁性,更是时间管理的重要环节。今天,…

安全防御:防火墙基本模块

目录 一、接口 1.1 物理接口 1.2 虚拟接口 二、区域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路检测模式 3.4 混合模式 四、安全策略 五、防火墙的状态检测和会话表技术 一、接口 1.1 物理接口 三层口 --- 可以配置IP地址的接口 二层口: 普通二层…

CSS在页面中使用的三种方式:行内样式、内嵌式样式表、链接式样式表

CSS样式如何在页面中使用,包含三种方式:行内样式、内嵌式样式表、链接式样式表。 CSS样式的使用系列博文: 《CSS在页面中使用的三种方式:行内样式、内嵌式样式表、链接式样式表》 《CSS选择器:基本选择器、复合选择器、…

[Vulnhub] violator ProFTPD+权限提升

信息收集 IP addressOpening Ports192.168.101.148TCP:21,80,2121 $ nmap -p- 192.168.101.148 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD 1.3.5rc3 80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) |_http-title: I Say...…

isaac sim中添加fix joint时,坐标系固定不动问题

例如想为机械臂末端增加一个工具坐标系,此时在flange中添加fixjoint,并依次添加flage和xform 如何xfrom没有添加rigid body属性的话,那么xfrom坐标系就会固定在世界坐标系中,程序启动后机械臂会移动到该坐标系处,并且无…

SpringBoot实现图形验证码

目录 项目创建 前端代码实现 约定前后端交互接口 需求分析 接口定义 Hutool工具 实现服务器端代码 引入依赖 获取验证码 验证码校验 调整前端代码 随着安全性的要求越来越高,目前许多项目中都使用了验证码,验证码也有各种类型,如 …

JavaWeb(四:Ajax与Json)

一、Ajax 1.定义 Ajax(Asynchronous JavaScript And XML):异步的 JavaScript 和 XML AJAX 不是新的编程语言,指的是⼀种交互方式:异步加载。 客户端和服务器的数据交互更新在局部页面的技术,不需要刷新…

android13 frameworks里面常用的保存信息或者版本判断的方法

总纲 android13 rom 开发总纲说明 目录 1.前言 2. 数据库 2.1 代码读取用法参考 3.prop 属性配置 3.1 property的key值有哪些特点 4.区别 5. 其他数据存储 6.彩蛋 1.前言 frameworks 不像我们一般开发app那样,很多应用保存的方法都无法使用。这里记录我们系统rom开…

【首发】分享一款三网话费余额查询的API系统

描述 对于计算机专业的小伙伴来说,多熟悉一个系统就多一份就业机会! 今天给大家分享一款三网话费余额查询的API系统 亲测可运行!! 内容 目前主要的内容以php为主,对于学习php有比较大的帮助! 但是网络上…

信息系统项目管理师(高项)—学习笔记二

第一章 以下是上一篇(信息系统项目管理师(高项)—学习笔记)的续写,因为是之前记录的,这一篇还是细致到每一个小节的内容,有些过于复杂了,后续会简化~ 1.3 现代化创新发展 党的十九…

亚信安全发布2024年第24期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周,勒索软件LockBit涉嫌对美国一家生产乙烯基产品的公司(Homeland Vinyl)进行攻击。LockBit声称他们已窃取了销售、库存、财务交易数据及其他公司记录,并声明将于2024年7月19日公开这些被盗信息。本周全球共监…

基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

GitHub连接超时问题 Recv failure: Connection was reset

用手机热点WIF拉取git项目的时候,遇到Recv failure: Connection was reset问题。 解决办法 一、手动开启本地代理 二、在终端(cmd)输入命令 git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy https:…

使用Nginx OpenResty与Redis实现高效IP黑白名单管理

1、引言 在当今数字化时代,网络安全已成为企业和个人用户关注的焦点。IP黑白名单作为一种有效的网络安全策略,允许我们精确控制对Web资源的访问权限。通过白名单,我们可以确保只有可信的IP地址能够访问敏感资源;而黑名单则可以阻…

Springboot交流论坛网站-计算机毕业设计源码00304

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了交流论坛网站的开发全过程。通过分析交流论坛网站管理的不足,创建了一个计算机管理交流论坛网站的方案。文章介绍了交流论坛网站的系统分析部分&…

手机和电脑通过TCP传输(一)

一.工具 手机端:网络调试精灵 电脑端:野火网络调试助手 在开始通信之前,千万要查看一下电脑的防火墙是否关闭,否则可能会无法通信 在开始通信之前,千万要查看一下电脑的防火墙是否关闭,否则可能会无法通信…

PostgreSQL安装/卸载(CentOS、Windows)

说明:PostgreSQL与MySQL一样,是一款开源免费的数据库技术,官方口号:The World’s Most Advanced Open Source Relational Database.(世界上最先进的开源关系数据库),本文介绍如何在Windows、Cen…

path+HTTP协议+IP+端口(nodejs)

一.path //导入 fs const fs require(fs); const path require(path); //写入文件 // fs.writeFileSync(__dirname /index.html, love); // console.log(__dirname /index.html);//resolve 解决 // console.log(path.resolve(__dirname, ./index.html)); // console.log(p…

基于EMQX+Flask+InfluxDB+Grafana打造多协议物联网云平台:MQTT/HTTP设备接入与数据可视化流程(附代码示例)

摘要: 本文深入浅出地介绍了物联网、云平台、MQTT、HTTP、数据可视化等核心概念,并结合 EMQX、Flask、InfluxDB、Grafana 等主流工具,手把手教你搭建一个支持多协议的物联网云平台。文章结构清晰,图文并茂,代码翔实易懂&#xff0…