【原创 架构设计】多级缓存的应用、常见问题与解决方式

ops/2024/9/22 17:11:13/

1. 简介

多级缓存是一种常见的性能优化手段,对于多级缓存一般意义上的理解具体主要实现其实指的就是本地缓存分布式缓存

本地缓存一般采用Caffeine或者Guava Cache来进行实现,而分布式缓存一般采用Redis来进行实现。

2. 业务流程

业务线程先在本地缓存中查询缓存数据,如果获取不到,则从分布式缓存中获取,并将结果存放到本地缓存中,然后返回给客户端。

本地缓存中数据会设置一定的有效期,在数据过期之后,将重复执行此操作,从分布式缓存中获取数据,如下图所示:
在这里插入图片描述

3. 优缺点与解决方案

本地缓存和分布式缓存本质上的作用都是为了提高程序的性能,减少对后端的数据存储资源的访问次数,转载请注明原文地址。

  • 本地缓存
    优点:速度最快,直接存储在业务进程内,方便使用和管理。
    缺点:多个节点实例之间的数据不一致,无持久化应用重启后就丢失,缓存容量受限于单进程内存限制,一般比较有限。
  • 分布式缓存
    优点:支持多个实例共享缓存数据,缓存容量更大,可扩缩容。
    缺点:速度相对来讲不如本地缓存,需要考虑故障恢复和一致性问题。

本地缓存同时也是分布式缓存热key的一种有效的解决手段,后面考虑写一篇详细介绍,感兴趣的朋友可以关注下。

3.1. 如何保证本地缓存的一致性

  1. 缓存数据加一个版本号

当某一个节点的数据发生变更之后,更新这条数据的版本号,并同步到数据库中,然后返回给客户端。客户端下次再来请求时携带这条数据的版本号,若请求到一个未更新本地缓存的节点上,发现参数中携带的版本号比自己的本地缓存中的版本号新,那么他会从共享存储中重新加载这条缓存,图示如下:

在这里插入图片描述

  1. 缓存数据变更通知

这个方法就很直接了,若节点修改了缓存的数据,那么需要通知其他节点去重新加载缓存数据,来保证多个节点之间的缓存数据一致性。常见的方式有:

1、 修改配置中心配置:配置中心的配置文件发生变更时会通知所有节点,节点收到更新配置的消息之后重新加载缓存
2、通过MQ广播消息:与修改配置中心的配置类似,当节点修改了缓存数据的时候,发送MQ消息,其他节点监听到这条消息之后更新缓存

  1. 最终一致

上面的两种方式实时性会好一些,若只需要最终一致性那就比较简单了,直接使用本地缓存自动失效或者自动更新功能。

// 访问后5秒过期---自动失效
Cache<String, String> cache = Caffeine.newBuilder().expireAfterAccess(5, TimeUnit.SECONDS).build();// 写入后5秒过期,重新加载缓存---自动更新
Cache<String, String> cache = Caffeine.newBuilder().refreshAfterWrite(5, TimeUnit.SECONDS).build(new CacheLoader<String, String>() {@Overridepublic @Nullable String load(String s) throws Exception {// 查询数据库或分布式缓存重新获取缓存return "";}
});

3.2. 本地缓存的适用场景

首先需要提到的一点:程序员做的一切都要以业务为目标,技术只是实现业务的工具。

使用本地缓存前,需要从业务上评估以下两点:

  1. 评估数据变化的频率

频繁变化的数据,是不适合放入本地缓存中去的,只有不会频繁变化的数据,才适合放到本地缓存中去。-----例如秒杀的库存数据,没人用本地缓存吧 ^ - ^。

  1. 评估业务上能否接受数据不一致,以及能接受不一致的时长

如果业务能够接受一定时长的不一致,可以根据其能接受的时长做缓存过期的时间设置,提前于最大不能接受的时长对缓存进行过期刷新处理。

4. 多级缓存扩展

完整的多级缓存不仅仅包含本地缓存与分布式缓存,还有一些其他的手段如:客户端缓存、CDN缓存、Nginx服务器缓存等。

根据业务需求,可以将一些不会变更的数据直接缓存到客户端,以此来减少请求服务器的次数。如秒杀的开始时间等,在一次请求服务器之后就可以进行本地计算到计时了,无需多次请求。

即内容分发网络,一般的前端js、css、html、图片、音视频等文件可以使用CDN进行加速,客户端发起请求时最近的一个CDN服务器会返回这些内容。这个一般我们程序员不需要太关心,知道有这个事即可,一般的云厂商都有这项服务,开启后即可进行CDN加速。

存放静态资源缓存,当没有CDN时会通过Nginx缓存读取。此外还可以存储IP黑名单、异常用户名单校验等缓存逻辑。


http://www.ppmy.cn/ops/114338.html

相关文章

力扣题解2374

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;中等&#xff09;&#xff1a; 边积分最高的节点 给你一个有向图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff0c;其中每个节点都 恰有一条 出边。…

儿童与成人目标检测系统源码分享

儿童与成人目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

高级I/O知识分享【5种IO模型 || select || poll】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;前文 2&a…

nvm 下载node报错:Could not retrieve https://nodejs.org/dist/index.json.

报错信息&#xff1a;Could not retrieve https://nodejs.org/dist/index.json. Get "https://nodejs.org/dist/index.json": dial tcp 104.20.23.46:443: i/o timeout 这是因为node源都是国外的服务&#xff0c;连接超时&#xff0c;所以我们把node源设置为国内的镜…

sql执行流程经典案例分析

现在有联合索引(a,b),select* form tb where b xx group by a执行流程是什么样子的? CREATE TABLE IF NOT EXISTS test(id INT(10) NOT NULL AUTO_INCREMENT COMMENT主键,a INT(10) NULL,b INT(10) NULL,PRIMARY KEY(id),INDEX idx_a_b(a,b))ENGINE INNODB;INSERT INTO test…

1.随机事件与概率

第一章 随机时间与概率 1. 随机事件及其运算 1.1 随机现象 ​ 确定性现象&#xff1a;只有一个结果的现象 ​ 确定性现象&#xff1a;结果不止一个&#xff0c;且哪一个结果出现&#xff0c;人们事先并不知道 1.2 样本空间 ​ 样本空间&#xff1a;随机现象的一切可能基本…

【YOLO目标检测学生课堂行为数据集】共4266张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;4266 标注数量(txt文件个数)&#xff1a;4266 标注类别数&#xff1a;3 标注类别名称&#xff1a;hand、read、write 数据集下载&#xff1a;学生课堂行为数据集 图片示例 数据集图片&#…

区块链DAPP质押系统开发

质押系统开发DAPP&#xff08;去中心化应用&#xff09;是一个涉及多个步骤和技术领域的复杂过程。以下是质押系统开发DAPP的主要步骤和关键点&#xff1a; 一、需求分析 明确需求&#xff1a;与客户深入沟通&#xff0c;明确项目的具体需求&#xff0c;包括功能特性、用户体验…