缓存热点,缓存穿透,终极解决方案看过来

二级缓存:本地热点缓存(本地java虚拟机的jvm缓存) 二级缓存:本地热点缓存 阅读详情

背景

前不久,因为公司业务需要,需要解决在大促场景下后端业务的热点缓存问题,所以研究了下缓存热点解决方案。

很多公司的缓存都是基于redis来做的,redis的性能其实已经足以能应付大部分的场景,但是对于大促期间或者活动抢购期间的某个爆品,可能会出现在几秒时间内流入大量的流量,由于某个爆品的数据在redis cluster场景下会按照hash规则被存放在某个redis分片上,那么这几秒的流量都会压到这个redis分片,从而在瞬间会导致这个redis分片的瘫痪,也会影响后续的redis请求的阻塞。

还有个场景,就是公司并不是所有的服务端逻辑都有缓存。在流量起来的时候,这些热key还是会压到数据库层面。导致压力。

解决方案

一般常见的解决方案就是增加二级缓存,对于热点数据写到jvm里一份。设置过期时间。但是什么时候设置,热点如何探测,规则如何设置,过期时间设置多少。甚至于如何快速落地,这都是需要研究的问题。

我们希望有一个统一的方案来解决这些问题。

我们发现了Hotkey这款开源框架。

Hotkey源于京东,hotkey能自动地对任意突发性的无法预知的热点数据,按照配置的规则进行毫秒级别的探测,探测到的热数据会推送到所有的服务端JVM中,大幅减轻对后端数据层的冲击。这些热数据在整个微服务集群会保持一致性,当热点消失的时候,自动从jvm中进行移除。

Hotkey的特性能很好的实现我们的目标。并且京东内部也用Hotkey实战了618大促,稳定性有所保障。

Hotkey的架构图(以下图引用自Hotkey在Gitee的主页)

Hotkey整个架构共分为以下几个部分:

worker:负责采集上报信息,根据规则计算出热点信息,规则来自于etcd。热点信息推送到client里

client: 每个client连接etcd,获取每个worker的ip和端口,和worker保持长链接,接受worker的热点信息推送

etcd:分布式的协调者,接受每个worker的心跳上报,并把worker的连接信息推送给client。监听规则的改变,推送给worker

dashboard:ui界面,查看实例以及worker的状态,查看以及修改规则数据。规则存到mysql,同时由etcd推送给worker

下面给出hotkey的项目地址

https://gitee.com/jd-platform-opensource/hotkey

关于Hotkey的介绍和如何搭建,大家可以看这篇文章来了解,这里就不多赘述。

碰到的问题

我们在搭建hotkey环境和落地实施中,碰到2个问题:

  • Hotkey虽然开源,但是相关client jar包并未上传中央仓库,dashboard和worker启动包也并未提供下载。需要下载源码进行编译,编译过程中也碰到一些包依赖的问题。
  • Hotkey的client jar只提供了api级别的方法供程序使用,如果要落地到业务项目中,需要大规模的修改代码才能实施。

我们更希望提供一种侵入更少的方式,在RPC以及接口的层面进行代理包装。使用者无论使用什么RPC框架,只是在相关接口上打上标注,而无需动业务的任何代码。就可以在这个接口层面进行检测热点。如果该接口的某个参数为热点的话,就自动进行代理,走jvm的热点数据,等热点消除后,依旧走原来的调用。

如果你觉得上述的描述过于难以理解的话,那么直白点说就是:

比如某个活动大促期间有个商品S001进行抢购,有大量的流量进入了商品详情页面。这个商品详情RPC方式调用了商品服务的以下接口方法获取商品信息:

public interface ProductService{
  SkuInfo getSkuInfo(String skuCode);
}

那么我们希望只在这个接口上打上标注。就可以适配Hotkey框架进行探测热点,当商品S001被大量请求时,S001这个商品就可以成为热点,这时getSkuInfo这个接口就会被自动代理,从而只从Jvm中获取数据,而不会真正走RPC调用。等热点消除后,这个接口依旧调用RPC获取数据。

这样的方式无疑侵入性更小,更容易使Hotkey框架落地。

Hotlink客户端

为此我们基于Hotkey client研发了Hotlink客户端框架,该客户端框架能让Hotkey更完美的落地,增强了Hotkey客户端的能力。

Hotlink的项目地址:https://gitee.com/openbeast/hotlink

该客户端框架有以下特点:

  • 业务接入简单,只需要一个标注,1分钟就能使你的RPC接口接入热点探测框架
  • 启动时动态扫描所有Hotlink标注的接口,创建动态代理
  • 基于动态代理去对接口做增强,理论上只要有接口,就支持任何RPC框架
  • 本地方法只要有接口,也能使用热点探测

结合Hotkey的架构图,Hotlink在整个架构图中的位置如下图:

Hotlink如何使用

第一步

按照Hotkey的部署要求,搭建好worker和dashboard。具体方式请参照:

https://gitee.com/jd-platform-opensource/hotkey

同时为了方便大家搭建,我把编译好的worker和dashboard包也进行了上传

worker下载地址:

公网IP版本(适合调试用,本地能连上worker):

https://gitee.com/openbeast/hotlink/attach_files/813746/download/worker-0.0.4-SNAPSHOT-public.jar

内网IP版本:

https://gitee.com/openbeast/hotlink/attach_files/813747/download/worker-0.0.4-SNAPSHOT.jar

Dashboard:

https://gitee.com/openbeast/hotlink/attach_files/813749/download/dashboard-0.0.2-SNAPSHOT.jar

第二步

本地业务项目依赖jar包(此jar包并未上传到中央仓库,需要大家自己deploy到自己公司的私库)

<dependency>
  <groupId>com.thebeastshop</groupId>
  <artifactId>hotlink-spring-boot-starter</artifactId>
  <version>1.0.12</version>
</dependency>

hotlink需要的fastjson和groovy版本有点要求,如果你项目中的这2个包版本过低又同时覆盖了hotlink的传递依赖包时,需要额外指定版本:

<fastjson.version>1.2.70</fastjson.version>
<guava.version>29.0-jre</guava.version>

第三步

本地springboot配置文件里加入参数

#此app-name不配置的话,会优先读取spring.application.name属性
hotlink.app-name=test
#etcd地址和端口
hotlink.etcd-url=http://xxx.xxx.xxx.xxx:2379

第四步

在你的接口里加入标签@Hotlink

在接口上加:接口里所有的方法都会自动探测热点

在方法上加:只有这个方法会自动探测热点

比如:

public interface ProductService{
  @Hotlink
  SkuInfo getSkuInfo(String skuCode);
}

那么当某一个SKU001成为热点时,那么传入参数SKU001会自动代理从JVM里取到数据,而SKU002则继续走RPC调用。

这样就完成了所有的配置。启动皆可。

使用Hotlink需要注意的事项

由于Hotlink的实现是用动态代理来实现,只要满足这两个条件,即可在启动时会扫描器扫到:

  • 接口层面上标注@Hotlink
  • 相关实现会被注入Spring上下文中

在标注接口的时候,尽量标注在一定时间范围内是幂等的接口。比如会员查询,sku信息查询,相关活动信息的查询,这些信息在一定时间范围内不会频繁变动,那么就适合做热点探测。

非幂等性的接口,即便是相同参数,每次返回也会不一样。那就不建议做热点探测。比如下单,库存的查询,余额的查询。这样的接口如果一旦被升级成热点。那会影响业务界面的正确性和后续逻辑的判断错误。

如何避免缓存穿透、缓存击穿、缓存雪崩? 缓存击穿是指缓存中没有但数据库中有的数据(⼀般是缓存时间到期),这时由于并发⽤户特别多,同时读缓存没读到数据,⼜同时去数据库去取数据,引起数据库压⼒瞬间增⼤,造成过⼤压⼒。和缓存雪 崩不同的是,缓存击穿指并发查同⼀条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从⽽ 查 数据库。缓存雪崩是指缓存同⼀时间大面积的失效,所以,后⾯的请求都会落到数据库上,造成数据库短时间内 承受⼤量请求⽽崩掉。缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承 受⼤量请求⽽崩掉。 阅读详情

相关推荐

大模型技术驱动智慧矿山数字化转型

多模态大模型作为AI领域的前沿技术,通过融合视觉、传感器等多源数据,构建了强大的环境理解与决策能力。其核心价值在于打破数据孤岛,实现实时分析与智能响应,特别适用于工业场景中的复杂系统优化。在智慧矿山建设中,该技术通过数字孪生、设备自诊断和智能调度等模块,显著提升了安全生产效率和资源利用率。典型应用包括基于强化学习的采掘路径规划、多层级灾害预警体系构建,以及可自我更新的矿山知识图谱系统,这些创新正在推动传统矿业向数字化、智能化方向转型。

weixin_29061531的博客 223

缓存热点自动发现和处理的架构设计实践

一、为什么要用缓存集群 啥叫热 Key 和大 Value 呢?简单来说,热 Key,就是你的缓存集群中的某个 Key 瞬间被数万甚至十万的并发请求打爆。 大 Value,就是你的某个 Key 对应的 Value 可能有 GB 级的大小,导致查询 Value 的时候出现网络相关的故障问题。 先来看看下面的一幅图: 简单来说,假设你手头有个系统,他本身是集群部署的,然后后面有一套缓存集群,这个集群不管你用 Redis Cluster,还是 Memcached,或者是公司自研缓存集群,都可以。 那么

lzf的博客 710

别再手动拆解字节了!用博图这个功能指令,5分钟搞定ARRAY转BOOL数组

本文详细介绍了西门子博图中`ARRAY_TO_BOOL`功能指令的高效应用,帮助工程师快速实现ARRAY到BOOL数组的转换。通过实战案例和参数配置指南,展示了如何5分钟内完成传统方法需半小时的任务,大幅提升PLC编程效率,特别适用于通信报文解析和设备状态监控。

weixin_42653691的博客 265

Redis热点Key发现及常见解决方案

Redis热点Key发现及常见解决方案 转载自:Redis热点Key发现及常见解决方案 一、热点Key问题产生的原因 1、用户消费的数据远大于生产的数据(热卖商品、热点新闻、热点评论、明星直播)。 在日常工作生活中一些突发的的事件,例如:双十一期间某些热门商品的降价促销,当这其中的某一件商品被数万次点击浏览或者购买时,会形成一个较大的需求量,这种情况下就会造成热点问题。 同理,被大量刊发、浏览的热点新闻、热点评论、明星直播等,这些典型的读多写少的场景也会产生热点问题。 2、请求分片集中,超过单 Server

架构路上的博客 1959

从配置字到实际运动:手把手教你用EtherCAT调试伺服电机的控制模式(以倍福TwinCAT3为例)

本文详细介绍了如何使用EtherCAT调试伺服电机的控制模式,以倍福TwinCAT3为例。从环境搭建、模式配置到状态机切换,提供了完整的操作指南和典型故障排查方法,帮助工程师快速解决‘配置字写入了但电机不转’等常见问题,提升工业自动化现场的调试效率。

weixin_42783709的博客 421

【Jlink & C#】通过C#实现Jlink RTT上位机的功能

某天看到安富莱家的自己开发的调试器可以实现输出中文调试信息到自己编写的Jlink RTT上位机上,觉得无比神奇,略好奇到底是如何做的,找了很久,发现其上位机的对应的实现好像也没有完全开源出来。后来经过很多搜索确认,知道了几个事实:那么有没有可能用C#来控制Jlink呢?答案是,有!!! 解决思路在于,C#调用JLinkARM.dll里面的函数 这里转载下我认为很有意义的发现结合以上的几个发现,加上我自己的测试,我把我对接JLinkARM.dll的C#接口分享出来,不保证都能用,我只是测试了几个常用的功能,R

一只爱做笔记的码农 9154

基于热点发现的本地缓存的架构设计

基于流式计算技术的缓存热点自动发现 其实这里关键的一点,就是对于这种热点缓存,你的系统需要能够在热点缓存突然发生的时候,直接发现他,然后瞬间立马实现毫秒级的自动负载均衡。 那么我们就先来说说,你如何自动发现热点缓存问题?首先你要知道,一般出现缓存热点的时候,你的每秒并发肯定是很高的,可能每秒都几十万甚至上百万的请求量过来,这都是有可能的。 所以,此时完全可以基于大数据领域的流式计算技术来进行...

XR风云 970

漫画安全HIDS、EDR、NDR、XDR

漫画安全HIDS、EDR、NDR、XDR

墨痕诉清风的博客 3447

缓存热点和缓存穿透的终极解决方案

很多公司的缓存都是基于redis来做的,redis的性能其实已经足以能应付大部分的场景,但是对于大促期间或者活动抢购期间的某个爆品,可能会出现在几秒时间内流入大量的流量,由于某个爆品的数据在redis cluster场景下会按照hash规则被存放在某个redis分片上,那么这几秒的流量都会压到这个redis分片,从而在瞬间会导致这个redis分片的瘫痪,也会影响后续的redis请求的阻塞。如果该接口的某个参数为热点的话,就自动进行代理,走jvm的热点数据,等热点消除后,依旧走原来的调用。

会飞的架狗师的博客 200

AutoSAR配置视频讲解:新建DaVinci工程

AutoSAR实验视频讲解:闪烁一颗LED实验【新建DaVinci工程】 上一篇 | 下一篇 | 总目录 实验架构图 视频本频放在了文末,下图描述了本次实验配置内容在AutoSAR架构中的位置,供大家参考 实验内容 本节课程讲解新建DaVinci工程,听上去新建工程很简单,但是还是需要很多的准备工作和细节。主要内容是新建工程和导入dbc文件和导入arxml文件的方法 主要步骤 新建DaVinci工程 导入.dbc通信矩阵文件 导入Mcal的arxml文件 实验视频2:Mcal配置 提示:版权所在,违

雪云飞星的博客 6276

强化学习在视觉导航中的应用

强化学习在视觉导航中的应用​ ,人工智能,计算机视觉,大模型,AI,强化学习(Reinforcement Learning, RL)是一种通过智能体(Agent)与环境进行交互,以最大化累积奖励为目标的机器学习范式。它不依赖于预定义的规则或大量标注数据,而是让智能体在试错过程中学习最优策略。计算机视觉(Computer Vision)则赋予智能体 “观察” 环境的能力,使其能够从图像或视频中提取有用信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

Redis缓存异常场景深度解析:穿透、击穿、雪崩及终极解决方案

问题类型核心特征推荐解决方案适用场景缓存穿透查询不存在的数据布隆过滤器+空对象缓存防御恶意请求缓存击穿热点Key突发失效互斥锁+逻辑过期高频访问热点数据缓存雪崩大量Key同时失效随机过期+多级缓存大规模缓存初始化通过分层防御和自动熔断机制,可构建弹性缓存体系。建议结合业务特点选择组合策略,并定期进行压力测试。没有万能的银弹,只有持续优化的架构。

chengong9988的博客 1391

ESP8266-Arduino编程实例-TEA5767收音机模块驱动

TEA5767HN 是一款用于低压应用的单芯片电子调谐 FM 立体声收音机,具有完全集成的中频 (IF) 选择性和解调功能,频率范围从76—108MHZ自动数字调谐。 该收音机完全无需调整,高灵敏度,高稳定性,低噪音,收音模块。只需要最少的小型低成本外部组件。 收音机可以调到欧洲、美国和日本的 FM 波段。...

视觉与物联智能 1981

Redis 缓存三大问题终极方案:穿透、击穿、雪崩与热点数据重建

本文深入探讨 Redis 缓存中常见的三大问题:穿透、击穿和雪崩,以及热点数据重建的挑战与解决方案。通过分析问题成因和影响,提供系统化的解决方案和技术实现,帮助开发人员构建高可用、高性能的缓存系统。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1143

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

HoRain云--Redis缓存三大难题:穿透、雪崩、击穿终极解决方案

Redis缓存三高问题解决方案 [摘要] Redis在分布式系统中面临缓存穿透、雪崩和击穿三大高并发风险。本文系统分析了各问题的成因、影响和应对策略:缓存穿透建议使用布隆过滤器和空值缓存拦截无效请求;缓存雪崩推荐采用随机过期时间和多级缓存分散压力;缓存击穿可通过热点Key永不过期和互斥锁保护。综合预防策略包括集群高可用、实时监控和动态调整资源。实际应用中建议组合使用多种方案,并通过混沌工程定期验证系统容错能力。

sinat_57153473的博客 1077

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Redis】终极缓存四连杀:缓存预热、缓存击穿、缓存穿透、缓存雪崩,真的懂了吗?

终极缓存四连杀:缓存预热、缓存击穿、缓存穿透、缓存雪崩,真的懂了吗?

关关的博客 1033

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Redis缓存雪崩、缓存击穿终极解决方案:从原理到实战

缓存雪崩指在某一个时间段,大量缓存key同时过期或Redis服务宕机,导致所有请求直接打到数据库,瞬间将数据库压垮。缓存击穿指一个热点key在过期瞬间,同时有大量请求访问这个key,这些请求直接穿透缓存打到数据库。问题类型原因解决方案适用场景缓存雪崩大量key同时过期随机过期时间通用场景Redis宕机集群+本地缓存高可用要求永不过期+后台更新热点数据缓存击穿热点key过期互斥锁并发不高永不过期极高并发布隆过滤器防止穿透。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 891

Folly 项目 AI 代理设计审查指南(Design Vetting):在实现前用证据锁定正确方案

设计审查(Design Vetting)是 Folly 仓库中 [folly/agents](https://link.gitcode.com/i/d5b0db90ed73167110afa000a994d152) 规则包的一等公民规则:在**选择任何实质性设计或正确性修复方案之前**,先系统性地界定问题、排查未知、筛掉不可行方案,再对幸存方案做证据驱动的比较。本文基于 [folly/agents

gitblog_00729的博客 963

Java面试-Redis 缓存穿透、缓存击穿、缓存雪崩解决方案

本文系统梳理了Redis缓存三大灾难问题——缓存穿透、缓存击穿和缓存雪崩的解决方案。针对缓存穿透,提出布隆过滤器、缓存空值等防御策略;对于缓存击穿,采用互斥锁和热点数据永不过期等方法;应对缓存雪崩,建议设置随机过期时间、集群部署等方案。文章通过15+架构图解、7+故障推演和25道面试题,构建了一套完整的缓存防御体系,帮助开发者打造高可用的系统架构。全文从原理到实战,深入浅出地解析了缓存问题的本质与应对之道。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: Redis的五大数据类型实现原理
下一篇: 心态崩了,我怎么知道实际生产环境的 B+ 树索引有多少层?
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值