本地缓存与多级缓存

一、前言
缓存对于一个高并发场景下的微服务应用来说具有重要的作用,不管是在架构选型还是设计阶段,缓存都是应用扛高并发提升吞吐量的有效手段。缓存对于大多数开发的同学来说并不陌生,一个基本的缓存使用流程如下:
在这里插入图片描述
简而言之,缓存的使用流程可归纳如下:
在这里插入图片描述

请求到达服务端;
先从缓存获取数据,缓存命中直接返回;
缓存未命中,查询数据库,然后返回数据,同时同步缓存;

二、多级缓存问题
2.1 缓存分类
2.1.1 本地缓存
本地缓存指的是应用内部的缓存,也叫进程缓存。最大的优点是应用和cache是在同一个进程内部,请求缓存快,没有过多的网络开销。本地缓存的有的很多,具体来说:

在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适;
缺点是缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费;
2.1.2 分布式缓存
分布式缓存是指缓存与应用本身分离,相比本地缓存来说,很明显的优点是分布式缓存本身就是一个独立的应用或组件,与本地应用隔离,多个应用可共享缓存。

2.2 独立缓存的问题
一般来说,如果系统对于高并发的业务需求并不是很敏感,单机部署时,考虑使用本地缓存即可满足;

常用的本地缓存组件包括:ehcache,caffeine,guawa等,这些都是成熟的方案,在不少互联网项目中都有实践落地经验,可以直接拿来使用;

但本地缓存在分布式部署时一个最大的问题就是缓存一致性的问题,所以在分布式部署模式下,通常考虑使用分布式缓存组件,避免一致性问题;

成熟的分布式缓存组件有:memcached,springcache,jetcache等;

对于一个生产中的应用来说,随着业务数据量的不断增加,独立缓存给应用的架构设计带来了越来越多的挑战,具体来说,表现如下:

2.2.1 缓存雪崩问题
以redis来说,如果对于key的使用不当,很容易出现的一个问题就是缓存雪崩问题,这在高并发的业务场景中是出现过生产事故的,简单来说就是,对于那些高频查询的热点接口缓存数据,,一旦使用不当很容易在某个时间点出现集中失效,造成缓存雪崩。

2.2.2 对宽带压力大
以分布式缓存为例,不管是使用memcached还是redis等存储缓存数据,一旦大量的请求过来查询缓存时,由于缓存是跨机器甚至跨网络,这必然会对当前应用的带宽造成瞬时的冲击。

2.2.3 运行效率低
试想,如果在分布式缓存前面再加上一层本地缓存,即JVM的进程缓存,那么数据到达服务端时,就可以直接从应用进程内部的缓存中获取数据,这比从远端获取redis的缓存效率就更高了。

2.3 多级缓存方案
多级缓存的搭配使用,不仅可以解决上面提到的问题,同时也给架构设计上带来了更多的发挥空间,多级缓存的业务流程如下:
在这里插入图片描述
浏览器访问静态资源时,优先读取浏览器本地缓存
访问非静态资源(ajax查询数据)时,访问服务端
请求到达Nginx后,优先读取Nginx本地缓存
如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat)
如果Redis查询未命中,则查询Tomcat
请求进入Tomcat后,优先查询JVM进程缓存
如果JVM进程缓存未命中,则查询数据库

2.3.1 多级缓存实践方案推荐
目前多级缓存在业内经过多年的实践总结,也有不少成熟的方案可供参考,如下提供几种常用的方案提供参考:

caffeine + redis

caffeine 是一款优秀的本地缓存组件,API丰富,灵活度高,而redis就不再过多介绍了,相信不少同学对redis都比较了解。

ehcache + redis

ehcache是一款老牌的本地缓缓组件,经过多年的生产实践,性能可靠、稳定、可配置化参数丰富。

guava-cache + redis

guava是google的一款轻量级的组件,在本地缓存的使用方面性能非常优异,使用成本也很低。

三、jetcache介绍
3.1 jetcache概述
jetcache是阿里开源的基于java开发的缓存框架,支持多种缓存类型:本地缓存、分布式缓存、多级缓存。能够满足不同业务场景的缓存需求。

jetcache具有上手简单、性能高效、拓展性强等特点。支持缓存预热 、缓存key前缀等功能。结合spring-cache使用,可以实现十分优雅的缓存类型切换。

官网地址:GitHub - alibaba/jetcache: JetCache is a Java cache framework.

官方文档:https://github.com/alibaba/jetcache/tree/master/docs/CN

3.2 jetcache 特性
JetCache是由阿里巴巴 Group 开源的一款基于 Spring 和 Redis 的分布式缓存框架。它的主要特点包括:

基于注解:通过注解的方式来实现缓存的配置和使用,代码简洁,易于维护;
多级缓存:支持多级缓存,可以将数据缓存在本地内存、Redis、Tair、Memcached 等多种缓存存储中,提高缓存的命中率和查询效率;
多种缓存协议:支持 Redis、Tair、Memcached 等多种缓存协议,具有良好的可扩展性和兼容性,可以灵活切换缓存存储方式;
高性能:JetCache 针对分布式环境下的高并发访问优化了缓存的数据结构和查询算法,提供了较高的性能;
易用性:JetCache 的 API 简单易用,支持 Spring 注入和自定义配置,提供了丰富的缓存操作功能,非常适合中小型应用开发;
3.3 jetcache 应用场景
3.3.1 热点数据缓存
JetCache 可以将常用的热点数据缓存在本地或远程缓存中,减少数据库或其他数据源的访问,并提高响应性能和性能稳定性。

相当于是同时融合了本地缓存与分布式缓存,开发者可以根据实际需求选择本地缓存或远程缓存进行配置使用。

3.3.2 多级缓存融合
JetCache 支持多种缓存存储类型,可以将不同的缓存存储类型融合使用,以达到更高的缓存效率和命中率。

在多级缓存中,通常需要多种技术的整合,而引入jetcache之后,可以避免应用中同时引入本地缓存和分布式缓存组件,只需要按照规范开启相关的配置参数即可满足。

3.3.3 支撑高并发读写
JetCache 的缓存算法可以优化高并发读写场景,提高程序性能并降低系统压力。

3.3.4 高速访问查询
JetCache 使用缓存,可以实现高速查询和访问,减少等待时间,并提高用户体验。

3.4 JetCache API使用
3.4.1 缓存管理
JetCache 提供了 CacheBuilder 类来创建缓存,以及 Cache 对象来操作缓存,例如 get、put、remove 等。在调用 Cache 对象的 put 方法时,可以使用注解 @Cache 来设置缓存时间和名称等配置。

3.4.2 注解支持
JetCache 提供了多种注解来实现缓存操作,例如 @Cached,@CacheUpdate, @CacheInvalidate 等。使用注解的方式,可以更加方便地进行缓存操作,例如缓存预热、删除、更新等。

3.4.3 缓存类型
JetCache 支持多种缓存类型,例如本地 memory、Redis、Tair 和 Memcached 等缓存,可以根据业务需求来选择缓存类型。

3.4.4 Spring 集成支持
JetCache 提供了 Spring 集成支持,可以通过注解来注入和配置缓存,简化使用流程。

四、jetcache与springboot整合应用
严格意来说,jetcache并不是一个缓存解决方案,只能说算是一个缓存框架,然后把别的缓存放到jetcache中管理,这样就可以支持AB缓存一起用了。并且jetcache参考了springboot整合缓存的思想,整体技术使用方式和springboot的缓存解决方案思想非常类似。

在正式开始使用jetcache之前需要明确一下,jetcache并不是随便拿两个缓存就能拼接在一起使用,目前jetcache支持的缓存方案中,本地缓存和远程缓存各支持2种类,分别如下:

4.1 缓存支持类型
4.1.1 本地缓存类型

1、LinkedHashMap;

2、Caffieine;

4.1.2 远程缓存支持类型

1、Redis;

2、Tair;

4.2 maven 依赖
下面的依赖为后文案例演示所有需要的基本依赖,如果单独测试jetcache功能,单独引包即可;

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId></dependency>
<!--<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId>
<version>2.6.2</version></dependency>-->
<dependency>
<groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis</artifactId><version>2.5.11</version>
</dependency><dependency><groupId>
redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency></dependencies>

4.3 本地缓存方案
4.3.1 application 配置文件
可以参考git文档进行相关参数配置,下面为基本的配置文件

jetcache:statIntervalMinutes: 1 #每过1分钟在控制台汇总一次数据areaInCacheName: falselocal:default:type: linkedhashmap

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为配置OSPF与BFD联动示例

组网需求 如图1所示&#xff0c;SwitchA、SwitchB和SwitchC之间运行OSPF&#xff0c;SwitchA和SwitchB之间的交换机仅作透传功能。现在需要SwitchA和SwitchB能快速感应它们之间的链路状态&#xff0c;当链路SwitchA-SwitchB发生故障时&#xff0c;业务能快速切换到备份链路Swi…

【LeetCode刷题笔记(9-1)】【Python】【无重复字符的最长子串】【滑动窗口】【中等】

文章目录 引言无重复字符的最长子串题目描述提示 解决方案1&#xff1a;【滑动窗口】结束语 无重复字符的最长子串 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0c;但如果不了解代码背后的思…

七轴开源协作机械臂myArm视觉跟踪技术!

引言 ArUco标记是一种基于二维码的标记&#xff0c;可以被用于高效的场景识别和位置跟踪。这些标记的简单性和高效性使其成为机器视觉领域的理想选择&#xff0c;特别是在需要实时和高精度跟踪的场景中。结合机器学习和先进的图像处理技术&#xff0c;使用ArUco标记的机械臂系统…

爬虫国密加密案例:某医保服务

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL25hdGlvbmFsSGFsbFN0LyMvc2VhcmNoL21lZGljYWw/Y29…

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…

adb: error: cannot create file/directory ‘d:/1.png‘: No such file or directory

将文件从设备读取到PC 由于权限问题&#xff0c;不能直接pull到电脑磁盘根目录&#xff0c;否则会报错&#xff1a; adb pull <remote> <local> eg: C:\Users\admin>adb pull /sdcard/server.log C:\Users\admin\Desktop /sdcard/server.log: 1 file pulled.…

AI创作系统ChatGPT网站源码,支持AI绘画,支持GPT语音对话+智能思维导图生成

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

客观题测试-第7章查找

第1关&#xff1a;查找客观题测试&#xff08;一&#xff09; 1、关键字可以唯一地标识一个数据元素。 A、对 B、错 2、二叉排序树是一个动态查找表。 A、对 B、错 3、如果顺序表中各元素的查找概率相同&#xff0c;在顺序查找时&#xff0c;查找不成功的平均查找长度因…

nodejs微信小程序+python+PHP国漫推荐系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

TrustZone之其他设备及可信基础系统架构

一、其他设备 最后,我们将查看系统中的其他设备,如下图所示: 我们的示例TrustZone启用的系统包括一些尚未涵盖的设备,但我们需要这些设备来构建一个实际的系统。 • 一次性可编程存储器(OTP)或保险丝 这些是一旦写入就无法更改的存储器。与每个芯片上都包含相同…

【Vue2】Component template should contain exactly one root element.

问题描述 [plugin:vite:vue2] Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.原因分析 这个错误通常是由于 Vue 组件的模板中包含多个根元素导致的。Vue 要求组件模板中只…

图片速览 PoseGPT:基于量化的 3D 人体运动生成和预测(VQVAE)

papercodehttps://arxiv.org/pdf/2210.10542.pdfhttps://europe.naverlabs.com/research/computer-vision/posegpt/ 方法 将动作压缩到离散空间。使用GPT类的模型预测未来动作的离散索引。使用解码器解码动作得到输出。 效果 提出的方法在HumanAct12&#xff08;一个标准但小规…

13.FTP

FTP FTP配置 添加一个本地用户 设置个密码 服务类型是FTP 工作路径授权给用户 设置用户角色为网络管理员 开启FTP服务 R2的路径下有这些文件 在R1进行测试&#xff0c;输入刚才创建的用户密码 get 获取文件 put上传文件 也可以在PC进行访问 可以升级路由器系…

阅览窗格功能虽然便利,但有时会出错,特别是在Word和Excel文件中更为常见

当你打开预览窗格功能时&#xff0c;每次你打开Windows文件资源管理器并选择任何文件&#xff0c;你将在屏幕的右窗格上看到该文件的小预览缩略图。 由于这个新功能&#xff0c;你可以在Windows资源管理器的右窗格上以缩略图的形式看到文件的小预览。此功能在更快地识别文件方…

SVN小白常见操作流程

SVN小白常见操作流程 一、什么是Subversion&#xff1f;二、TortoiseSVN客户端安装教程三、SVN 操作3.1 SVN Ckeckout(检出)3.2 Add(新增文件)3.3 SVN Commit(提交)3.4 SVN Update(更新操作)3.5SVN Delete(删除操作)3.6 SVN Revert to a revision(版本回溯)3.7 不同版本内容之间…

三大主流前端框架介绍

在前端项目中&#xff0c;可以借助某些框架&#xff08;如React、Vue、Angular等&#xff09;来实现组件化开发&#xff0c;使代码更容易复用。此时&#xff0c;一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成&#xff0c;而是按照组件的思想将网页划分成一个个组…

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-GRU并行模型预测 3.1 数据加载&a…

ElementUI,修改el-cascader的默认样式

Element UI 中的下拉弹窗是通过在整个body标签末尾动态添加div实现的&#xff0c;所以修改样式时&#xff0c;必须要定义全局样式才能实现样式覆盖&#xff0c;那怎样才能避免全局的样式污染呢&#xff1f; 解决办法&#xff1a;通过给组件添加自定义的 popper-class 属性来避…

「新版」PyCharm 加载condav Environment / Conda executableis not found

在新版的 PyCharm 配置中&#xff0c;设置Conda环境不再与旧版本保持一致&#xff0c;对于新手而言可能不清楚如何加载&#xff0c;作者也是郁闷了好久&#xff0c;经过一顿输出发现需要通过加载conda配置&#xff0c;才调取conda虚拟环境&#xff0c;而不再是直接调取conda的虚…

06_Web框架之Django三

Web框架之Django三 学习目标和内容 1、能够通过ORM模型创建数据表 2、能够通过ORM模型对数据进行操作 3、能够理解ORM模型对应关系 一、ORM概念 1、ORM介绍 对象关系映射 用于实现面向对象编程语言里不同类型系统数据之间的转换。 其就是使用面向对象的方式&#xff0c;操作…