当前位置: 首页 > news >正文

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)
//构造备份新keybakHotKey = 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 发现以及解决办法 | 董宗磊的博客--靡不有初,鲜克有终

相关文章:

Redis的热key解决

1、Redis热Key会带来哪些问题 1、流量集中,达到物理网卡上限。 当某一热点 Key 的请求在某一主机上超过该主机网卡上限时,由于流量的过度集中,会导致服务器中其它服务无法进行。 2、请求过多,缓存分片服务被打垮。 如果热点过于…...

在linux中查找 / 目录下的以.jar结尾的文件(find / -name *.jar)

文章目录 1、查找 / 目录下的以.jar结尾的文件 1、查找 / 目录下的以.jar结尾的文件 [rootiZuf6332h890vozldoxcprZ ~]# find / -name *.jar /etc/java/java-1.8.0-openjdk/java-1.8.0-openjdk-1.8.0.342.b07-1.el9_0.x86_64/lib/security/policy/limited/US_export_policy.ja…...

【Python爬虫教程】第6篇-使用session发起请求

为什么要使用session 前面介绍了如何使用reqesuts发起请求,今天介绍如何使用session发起请求。session简单理解就是一种会话机制,在浏览器中我们登录完之后,后面再请求服务数据都不需要再登录了,以为Cookie里已经保存了你的会话状…...

【Hot100】LeetCode—763. 划分字母区间

目录 题目1- 思路2- 实现⭐763. 划分字母区间——题解思路 3- ACM 实现 题目 原题连接:763. 划分字母区间 1- 思路 思路 目标:同样的字母 字符串尽可能的长 问1:怎么确定字母数 ——> 哈希表问2:怎么让字符尽可能的长&#…...

分布式服务基于Zookeeper的分布式锁的实现

一、序言 ZooKeeper 的分布式锁机制是一种协调多个客户端访问共享资源的方法。通过使用 ZooKeeper 的持久化节点和临时顺序节点,可以实现高效且可靠的分布式锁。下面是分布式锁的工作原理以及如何使用它的具体步骤。 二、Zookeeper分布式锁的核心原理 创建锁目录节…...

Rust编程-I/O

文件读取: 依赖&#xff1a;标准库中use std::fs; 模块 读取文件&#xff1a;fs::read_to_string(filepath:string) -> Result<String> String是文件内容 下面代码来自《Rust权威指南》&#xff0c;主要作用是从文件中检索&#xff0c;并返回检索内容所在的行&#xf…...

FastAPI 学习之路(四十七)WebSockets(三)登录后才可以聊天

之前我们是通过前端自动生成的token信息&#xff0c;这次我们通过注册登录&#xff0c;保存到本地去实现。首先&#xff0c;我们实现一个登录页面&#xff0c;放在templates目录下。 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…...

数据结构—链式二叉树-C语言

代码位置&#xff1a;test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 在现实中搜索二叉树为常用的二叉树之一&#xff0c;今天我们就要通过链表来实现搜索二叉树。实现的操作有&#xff1a;建二叉树、前序遍历、中序遍历、后序遍历、求树的节点个数、求…...

nginx代理gitee

背景 若干台agv设备&#xff0c;这些设备都是没有公网的(无法访问百度等)。 一台服务器(ubuntu20.04)有线可以公网&#xff0c;无线可以实现内部通信(agv&#xff0c;plc等设备)。 目的 agv每一次更新代码&#xff0c;拉取代码等都需要切换到有公网的网络&#xff0c;多台agv设…...

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP&#xff0c;后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案&#xff0c;可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署&#xff01;加密通道&#xff01;牢牢掌握通…...

Camunda如何通过外部任务与其他系统自动交互

文章目录 简介流程图外部系统pom.xmllogback.xml监听类 启动流程实例常见问题Public Key Retrieval is not allowed的解决方法java.lang.reflect.InaccessibleObjectException 流程图xml 简介 前面我们已经介绍了Camunda的基本操作、任务、表&#xff1a; Camunda组件与服务与…...

Django ORM中ExpressionWrapper的用途

ExpressionWrapper 在 Django ORM 中&#xff0c;直接在 filter 方法中进行字段间的比较时&#xff0c;不能直接使用算术运算符&#xff08;如 、-、*、/&#xff09;来操作 F 对象&#xff0c;需要使用 ExpressionWrapper 来包装表达式并指定输出字段类型。 使用Q对象&#…...

什么软件修复视频画质比较好,视频画质修复工具

有些视频中可能会出现噪点、残影、颜色失真等问题&#xff0c;导致观看时体验感不太好&#xff0c;修复视频画质可以去除这些问题&#xff0c;使视频更加干净、清晰和真实。 高质量的视频画质能够提高观众的观看体验&#xff0c;让观众更加享受观看视频的过程。特别是在需要展示…...

效能工具:执行 npm start 可直接切换proxy代理UR后直接启动项目

1) 背景: 我们项目是2个前端3个后端的配置。前端和每个后端都有需要调试的接口。 因此经常切换vite.congig.js中的proxy后端代理链接&#xff0c;是挺麻烦的。 于是我研究如何能快速切换后端URL&#xff0c;所幸懒人有懒福&#xff0c;我找到了Inquirer 和 fs&#xff0c; 实…...

MongoDB自学笔记(一)

一、MongoDB简介 MongoDB是一款基于C开发的文档型数据库。与传统的关系型数据库有所不同&#xff0c;MongoDB面向的是文档&#xff0c;所谓的文档是一种名为BSON &#xff08;Binary JSON&#xff1a;二进制JSON格式&#xff09;是非关系数据库当中功能最丰富&#xff0c;最像…...

【AIGC】二、mac本地采用GPU启动keras运算

mac本地采用GPU启动keras运算 一、问题背景二、技术背景三、实验验证本机配置安装PlaidML安装plaidml-keras配置默认显卡 运行采用 CPU运算的代码step1 先导入keras包&#xff0c;导入数据cifar10&#xff0c;这里可能涉及外网下载&#xff0c;有问题可以参考[keras使用基础问题…...

【Qt】使用临时对象的坑

前言 使用临时对象时&#xff0c;一定要注意临时对象析构后是否会对代码造成影响&#xff0c;下面是一些可能出现的错误 std::string Widget::getStr() {return "nihao"; }void Widget::on_pushButton_clicked() {std::string objStr getStr();const char* str g…...

Apache-Flink未授权访问高危漏洞修复

漏洞等级 高危漏洞!!! 一、漏洞描述 攻击者没有获取到登录权限或未授权的情况下,或者不需要输入密码,即可通过直接输入网站控制台主页面地址,或者不允许查看的链接便可进行访问,同时进行操作。 二、修复建议 根据业务/系统具体情况,结合如下建议做出具体选择: 配…...

Unable to obtain driver using Selenium Manager: Selenium Manager failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

(01)Unity使用在线AI大模型(使用百度千帆服务)

目录 一、概要 二、环境说明 三、申请百度千帆Key 四、使用千帆大模型 四、给大模型套壳 一、概要 在Unity中使用在线大模型分为两篇发布&#xff0c;此篇文档为在Python中使用千帆大模型&#xff0c;整体实现逻辑是&#xff1a;在Python中接入大模型—>发布为可传参的…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...