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

news2024/9/22 12:36:43

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>() {
    @Override
    public @Nullable String load(String s) throws Exception {
        // 查询数据库或分布式缓存重新获取缓存值
        return "";
    }
});

3.2. 本地缓存的适用场景

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

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

  1. 评估数据变化的频率

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

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

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

4. 多级缓存扩展

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

  • 客户端缓存

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

  • CDN缓存

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

  • Nginx缓存

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚类_K均值

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs1.数据预处理 #创建基于高斯分布的样本点, x是点的坐标&#xff0c;y是所属聚类值 x, y make_blobs(n_samples100, centers6, random_state100, cluster_std0.6) # 设置图形尺寸…

整数在内存中的存储原码反码补码

目录 1.整数在内存中以二进制的形式存在 1.1&#xff08;正数存储情况&#xff09; 1.2 负数存储情况 1.3整数的补码如何得到原码 2.无符号整数的原反补码 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&am…

Linux网络——守护进程、会话、进程组

文章目录 会话守护进程编写守护进程的注意事项编写样例 会话 会话是session&#xff0c;代表的是客户端与服务器的一次交互过程&#xff0c;我们可以简单理解为&#xff0c;当我们打开一个终端&#xff0c;在用户登录时&#xff0c;就是创建了一个会话 一般来说会话都与各自的…

62. 不同路径、64. 最小路径和

思路 dp&#xff1a;代表到达当前位置的总方式 初始化&#xff1a;第一行的位置dp[0][j]&#xff1a;当前位置只能由左边的位置向右移动得到 所以只有1种方式 d[0][j]1, d[0][0]1 第一列的位置 dp[i][0]&#xff1a;当前位置只能由上一个位置向下移动得到 除此之外的位置可以由…

python画图|同时输出二维和三维图

前面已经学习了如何输出二维图和三维图&#xff0c;部分文章详见下述链接&#xff1a; python画图|极坐标下的3D surface-CSDN博客 python画图|垂线标记系列_如何用pyplot画垂直x轴的线-CSDN博客 有时候也需要同时输出二位和三维图&#xff0c;因此有必要学习一下。 【1】…

三明儿童自闭症寄宿制学校:关爱、教育、成长一站式服务

三明儿童自闭症寄宿制学校的启示&#xff1a;广州星贝育园——自闭症儿童的一站式成长乐园 在探讨自闭症儿童教育的道路上&#xff0c;寄宿制学校以其独特的优势&#xff0c;为孩子们提供了集关爱、教育、成长于一体的全方位服务。虽然文章开头提及了“三明儿童自闭症寄宿制学…

AI预测体彩排3采取888=3策略+和值012路或胆码测试9月15日升级新模型预测第81弹

经过80多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;已到达90%的命中率&#xff0c;这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大部…

请求响应-05.请求-日期参数JSON参数

一.日期参数 当浏览器发起的请求参数类型是日期参数时&#xff0c;我们通常使用LocalDateTime对象来接收&#xff0c;前面使用DateTimeFormat注解来完成日期的格式转换&#xff08;日期时间格式有多种&#xff0c;需要哪种就设置为哪种&#xff1a;如yyyy-MM-dd HH:mm:ss&…

C++比大小游戏

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <Windows.h> using namespace std; int main() {int ir 1;char chparr[2] { 0 };int ip1 0;int ip2 0;int i 1;c…

【ARM】Cache深度解读

Cache的基本概念和使用场景 不同的Master硬件共享数据时—invalid cache 外设和DDR之间没有cache&#xff0c;所以外设直接把数据写入DDR中&#xff0c;但是cpu和DDR之间有cache&#xff0c;cpu会首先访问cache&#xff0c;如果命中直接从cache中拿数据&#xff0c;但是此时的…

完整版订单超时自动取消功能

前几天对实习还是继续学习技术产生了抉择&#xff0c;问了一个前辈&#xff0c;他抛给我一个问题&#xff0c;怎么做15分钟订单自动取消&#xff0c;我说然后到时间之后&#xff0c;自动执行这个订单关闭业务&#xff0c;比如把锁了的库存给解开等等操作&#xff0c;然后在数据…

后续学习规划 ----含我个人的学习路线,经历及感受

目前的基础 开发相关&#xff08;最重要&#xff09; 1.Java SE 从入门到起飞 2.Java Web开发 3.苍穹外卖 以上三个是和开发相关的基础。 我是按照书写的顺序学习的&#xff0c;有需要的朋友可以参考。 计算机相关 其他的话&#xff0c;都是比较久远的了。隔得时间一年半…

【大数据方案】智慧大数据平台总体建设方案书(word原件)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…

nginx: [emerg] unknown “connection_upgrade“ variable 解决与思考

问题,如下图&#xff1a; 一天更新完主分支后启动nginx,结果报错&#xff1a;nginx: [emerg] unknown "connection_upgrade" variable 解决方法 网上查&#xff0c;发现是nginx配置文件出了问题&#xff0c;将下面map代码块补上即可。 http { map $http_upgrade …

深入理解算法效率:时间复杂度与空间复杂度

目录 引言 一、算法效率的基础 二、时间复杂度 1.概念 2.常见类型 1.O(1) — 常数阶 2.O(n) — 线性阶 3.O(n^2) — 平方阶 4.O(2^&#x1d45b;) — 指数阶 5.O(log &#x1d45b;) — 对数阶 3.总结 三、空间复杂度 1.概念 2.常见类型 1.O(1) — 常数阶 2.…

Linux进程(3)(进程优先级 - 优先级 - 命令行参数 - 环境变量)

目录 1.进程优先级 1&#xff09;什么是优先级 2&#xff09;为什么要有优先级 3&#xff09;Linux的优先级特点 && 查看方式 2.命令行参数和环境变量 3.环境变量 1&#xff09;直接现象 2&#xff09;见见更多的环境变量 3&#xff09;整体理解环境变量和系统…

【UEFI基础】BIOS模块执行的优先级

综述 BIOS下主要通过两种方式来确定一般模块的优先级&#xff0c;一种是fdf文件中指定的优先级&#xff0c;另一种是inf文件中指定的优先级。需要注意这里使用了“一般模块”的说法&#xff0c;因为有些模块&#xff08;尤其是PEI_CORE&#xff0c;DXE_CORE类型的模块&#xf…

Codeforces Round 972(Div.2)A+B

Codeforces Round 972&#xff08;Div.2&#xff09;ABC 昨天晚上做了Codeforces Round 972&#xff08;Div.2&#xff09;的A、B两道题&#xff0c;今天补一下思路。 题目来源&#xff1a;https://codeforces.com/contest/2005 A. Simple Palindrome 题目描述 输入输出样例…

linux---压缩打包

linux打包和压缩文件和目录&#xff1a; 归档(打包)命令&#xff1a;tar 归档就是将多个文件或者目录打包成为一个文件&#xff0c;存放再磁盘中&#xff0c;方便文件或者目录丢失时&#xff0c;可以恢复。 归档文件名使用相对路径 &#xff08;注意区分归档文件和被归档文…

Go 注册Nacos

根据需要GO 项目也接入Nacos 系统版本&#xff1a;Linux 5.4.18-87.76-generic KYLINOS SMP Thu Aug 31 09:05:44 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux Go:1.19.4 1.查看Nacos-sdk-go 官方适配自己的工程 github.com/nacos-group/nacos-sdk-go NacosManager.go p…