Redis学习系列之—— JDHotKey 热点缓存探测系统

一、为什么需要热点缓存探测

在回答这个问题前,我们先考虑一下:为什么光用 Redis 还不够,还需要使用本地缓存?

一般来说,Redis 集群的性能能抗住几十万并发,能够应付大部分情况。但对于一些头部 APP,当出现热点舆情、商品秒杀活动等百万并发的场景,Redis 集群也来不及处理这么多请求,更何况对某一个热点 key 的请求会打到同一个 Redis 分片上。这会导致 Redis 服务超时甚至不可用,最终形成缓存雪崩。

如果能把热点数据缓存到应用程序节点中,就可以解决问题,因为本地缓存有以下优势:

1、数据不需要通过网络传输,能提升性能

2、由于应用的高扩展性,本地缓存是天然的分布式存储,负载分担容易实现

3、本地缓存可以缓解远程缓存的压力

但是,使用本地缓存最重要的问题是:本地内存有限,无法支持大量数据存储

因此在超高并发业务下,需要引入热点缓存探测系统(以下简称"热点系统"),它解决本地缓存问题的方法大致如下:

由于本地内存有限,所以最好是只存储热点数据,从而兼顾内存规模和缓存命中率。但是超高并发业务往往采用大量的应用节点,每个节点分担到的流量有限,所以单个节点仅分析自身的数据使用情况,难以及时得知哪些是热点 key。而热点系统把各节点的数据使用情况进行收集、汇总,从全局判断出哪些属于热点 key,再把热点 key 推送给各应用节点。

二、热点 key 的使用场景

热点数据有两个重要特性:有限时间、流量高聚。热点 key 的使用场景主要有:

1、正面的:例如热门商品的 id、热点舆情的 id。这些 key 作为热点 key 后,数据缓存到本地,商品详情、舆情详情等信息就不用再从 Redis 获取了,减小了 Redis 压力。

2、负面的:例如使用抢票脚本的 ip 地址。这些 key 作为热点 key 后,数据缓存到本地,当请求到来后,直接从本地缓存看一下是否存在,若存在就拒绝这些请求。

当然,热点系统只是把 key 当作一个字符串,具体在什么场景使用,非常灵活。

三、JDHotKey 架构剖析

(一)整体架构

JDHotKey 主要由 4 个组件构成:

**1、etcd:**etcd 是一个高性能的配置中心,可以以极小的资源占用,提供高效的监听订阅服务。主要用于存放规则配置,各 worker 的 ip 地址,以及探测出的热 key、手工添加的热 key 等。

**2、client:**client 是在应用中添加的引用 jar,引入后,就可以以便捷的方式去判断某 key 是否热key。同时,该 jar 完成了 key 上报、监听 etcd 里的 rule 变化、worker 信息变化、热 key 变化,对热 key 进行本地 caffeine 缓存等。

**3、worker:**worker 端是一个独立部署的 Java 程序,通常部署多台根据 key 的 Hash 值进行流量分担。worker 启动后会连接 etcd,并定期上报自己的ip信息,供client端获取地址并进行长连接。之后,对各个client发来的待测key进行累加计算,当达到etcd里设定的rule阈值后,将热key推送到各个client。

**4、dashboard:**dashboard 是一个可视化控制台,启动后会连接 etcd,之后在控制台设置各个 APP 的 key 规则。然后当worker探测出来热key后,会将 key 发往 etcd,dashboard 也会监听热 key 信息,进行入库保存记录。同时,dashboard 也可以手工添加、删除热 key,供各个 client 端监听。

(二)核心业务逻辑

**1、规则维护:**主要由运营人员通过 dashboard 配置热点规则,比如:对于所有 product 开头的 key,2秒内出现20次访问算热 key)。

**2、热点上报:**client 端会根据热点规则,将参与热点统计的 key 进行本地统计,并定期(默认 500 ms 一次)上报给 worker。上报时,会对 key 进行 hash 运算后取余,找到对应的 worker 进行上报。

**3、热点统计:**每个 worker 会负责自己管辖范围内的 key 的统计,采用的是滑动窗口算法。

**4、热点推送:**当 worker 热点统计发现热 key 时,将热 key 推送给所有的 client。此外,dashboard 也可以手动添加或删除热 key 并进行推送。

**5、热点缓存:**当 client 收到热点推送后,会从本地的热 key 集合中进行添加或删除。开发人员可以通过 client 提供的 SDK 查询某个 key 是否为热 key,也可以通过 SDK 从本地缓存(Caffiene)中存入、获取、删除热 key 对应的 value。

参考:https://mp.weixin.qq.com/s/xOzEj5HtCeh_ezHDPHw6Jw

相关推荐
二宝哥16 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
ShiXZ2131 天前
Redis docker-compose 部署指南
redis·docker·eureka
青山木1 天前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
YDS8291 天前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
爬也要爬着前进2 天前
redis主从搭建
数据库·redis·缓存
用户095367515832 天前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌2 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群
明豆2 天前
Redis 分布式缓存生产实战
redis·分布式·缓存
海兰2 天前
【高速缓存】RedisVL 指南:从向量搜索到 AI 应用落地
人工智能·redis
weixin_727535622 天前
双Token认证体系深度拆解:Spring Security + JWT + Redis
redis·spring·wpf