本地缓存与多级缓存

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

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

二、多级缓存问题
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

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

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

相关文章

NNDL 作业11 LSTM [HBU ]

目录 习题6-4 推导LSTM网络中参数的梯度&#xff0c; 并分析其避免梯度消失的效果 >LSTM前向传播 >反向传播 求梯度 >梯度消失和梯度爆炸怎么来的&#xff1f; >关键点&#xff1a;LSTM如何缓解梯度消失&#xff1f; 习题6-3P 编程实现下图LSTM运行过程 1…

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记&#xff1a;【二叉树篇】合并二叉树 日期&#xff1a;2023.12.18 参考&#xff1a;代码随想录、力扣 617. 合并二叉树 题目描述 难度&#xff1a;简单 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xf…

【Axure RP9】实现登入效验及实现左侧菜单栏跳转各页面

目录 一 效验简介 1.1 校验好处 1.2 应用场景 二 登入校验 2.1 效果 2.2 实现流程 三 左边菜单栏左侧菜单栏跳转各页面 3.1 效果 3.2 实现图 一 效验简介 1.1 校验好处 提高安全性&#xff1a; 在传统的用户名和密码登录的基础上&#xff0c;引入了另一种或多种验证…

C++中的继承(二)

文章目录 前言多继承虚继承虚继承的底层组合 前言 上一篇文章我们C的正常继承其实已经讲完了&#xff0c;但是后面还有一个大坑。 实际当中继承有单继承和多继承。 单继承就是直接继承一个类。 只有一个直接父类的就叫做单继承。 如果是单继承那就比较简单。 现实世界除了有…

Docker部署MinIO对象存储服务器结合内网穿透实现远程访问

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

OpenCV技术应用(7)— 将图像转为热力图

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成热力图&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 伪彩色处…

C++ Qt 开发:ListWidget列表框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。…

centos下:mysql一些指令+mysql首次修改密码+mysql忘记密码修改

操作 查看mysql运行状态 systemctl status mysqld 停止mysql systemctl stop mysqld 启动mysql systemctl start mysqld 重启mysql systemctl restart mysqld 开启mysql开机自启动 systemctl enable mysqld 关闭mysql开机自启动 systemctl disable mysqld 查看具体的报错日…

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

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

网络编程『socket套接字 ‖ 简易UDP网络程序』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文1.预备知识1.1.IP地址1.2.端口号1.3.端口号与进…

超级计算机与天气预报:精准预测的科技革命

超级计算机与天气预报&#xff1a;精准预测的科技革命 一、引言 随着科技的飞速发展&#xff0c;超级计算机已经成为现代社会不可或缺的一部分。它们在科研、工业、军事等领域发挥着重要作用&#xff0c;其中天气预报是一个颇具代表性的应用领域。本文将探讨超级计算机在天气…

[ CTF ]【天格】战队WriteUp-第七届“强网杯”全国安全挑战赛

第七届“强网杯”全国安全挑战赛 2023.12.16~2023.12.17 文章目录 【Misc】Pyjail ! Its myFILTER !!!easyfuzz谍影重重2.0签到Pyjail ! Its myRevenge !!!server_8F6C72124774022B.py 问卷调查 【Reverse】ezre 【Web】happygame 【强网先锋】石头剪刀布TrieSpeedUpezreez_fmt…

最新AI创作系统ChatGPT系统源码+DALL-E3文生图+支持AI绘画+GPT语音对话功能

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

[linux]进程间通信-管道pipe的实际用法(写入/读取)

一、需求 现有两个进程A和B&#xff0c;B进程含较为独立且复杂的业务逻辑&#xff0c;A进程为主控进程&#xff0c;现A进程需要控制B进程执行对应的功能&#xff0c;且要保持响应及时。 二、分析 典型进程间通信案例&#xff0c;因此使用linux下的管道方法&#xff08;pipe&…

打响指针的第一枪:指针家族

前言 指针其实是我们学习C语言中最难的知识点&#xff0c;很多人在学习指针的时候会被绕晕&#xff0c;包括博主也是&#xff0c;当初百思不得其解&#xff0c;脑袋都要冒烟了&#xff0c;本来打算在学习指针的时候就写一篇博客&#xff0c;但是当初自己的能力还是没有办法去完…

SQL语句整理二--Mysql

文章目录 知识点梳理&#xff1a;1. mysql 中 in 和 exists 区别2. varchar 与 char 的区别 查看表结构&#xff1a;获取当前时间&#xff1a;查看建表语句&#xff1a;修改用户密码&#xff1a;查看所有用户&#xff1a;grant命令&#xff1a;判断当前数据库有多少连接数&…

WPF Icon矢量库 MahApps.Metro.IconPacks

文章目录 前言MahApps.Metro.IconPacksIconPacks.Browser简单使用简单使用案例代码Icon版本个人推荐 Icon自定义版权问题 前言 为了更快的进行开发&#xff0c;我找到了一个WPF的矢量图库。这样我们就不用去网上找别人的矢量库了 MahApps.Metro.IconPacks MahApps.Metro.Icon…

21.Servlet 技术

JavaWeb应用的概念 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义&#xff1a;“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行。” Java Web应用中可以包含如下…

BearPi Std 板从入门到放弃 - 先天神魂篇(9)(RT-Thread DAC->ADC)

简介 RT-Thread DAC->ADC 使用, 就是DAC1输出模拟量, ADC1 读取模拟量转化成电压值, 基于开发板 &#xff1a; Bearpi Std(小熊派标准板)主芯片: STM32L431RCT6串口: Usart1DAC1: PA5, OUT2ADC1: PC2, IN3将板子上的E53 接口, 5 和 6用排线相连, 即实现内部DAC1->ADC1 …

P2P网络下分布式文件共享场景的测试

P2P网络介绍 P2P是Peer-to-Peer的缩写&#xff0c;“Peer”在英语里有“对等者、伙伴、对端”的意义。因此&#xff0c;从字面意思来看&#xff0c;P2P可以理解为对等网络。国内一些媒体将P2P翻译成“点对点”或者“端对端”&#xff0c;学术界则统一称为对等网络(Peer-to-Pee…