SpringCache

1、基本信息      

        Spring缓存方案:JDK内置的缓存(ConcurrentHashMap)、第三方缓存组件(Caffeine)、分布式的缓存实现(Memcahed、Redis)。
        ConcurrentHashMap是JUC之中提供最为重要的技术实现。SpringCache之中为了便于缓存结构的管理,在“org.springframework.cache”包中提供了两个核心的标准接口,分别为:Cache实现接口、CacheManager管理接口。

         Cache接口规定了缓存数据的保存、增加、失效以及清空处理的操作功能,而想获取到Cahe实例,需要CacheManager接口方法完成,所有的Caceh对象都在CacheManager之中保存。
        在缓存实现的过程中,Spring是基于Cache接口提供的方法进行缓存操作的,所以不同的缓存组件如果要接入到Spring之中,则需要提供Cache接口的具体实现子类。对于缓存的管理问题,在Spring中又提供了CacheManager接口,所有可以在应用中使用的Cache类型全部在该接口之中进行配置。

2、实现方式:

配置CacheManager:

@Configuration
@EnableCaching
public class SpringCacheConfig {@Beanpublic CacheManager cacheManager(){//获取缓存管理接口实例SimpleCacheManager simpleCacheManager=new SimpleCacheManager();//保存全部的缓存集合Set<Cache> cacheSet=new HashSet<>();//缓存名称cacheSet.add(new ConcurrentMapCache("name1"));cacheSet.add(new ConcurrentMapCache("name2"));cacheSet.add(new ConcurrentMapCache("name3"));//保存到返回对象中simpleCacheManager.setCaches(cacheSet);return simpleCacheManager;}}

在使用的地方打注解:@Cacheable(cacheNames = "name1")

3、Cacheable详解

Cacheable注解内部属性解释:

         在使用Cacheable注解的时候,有两个核心的配置属性,一个缓存条件,一个缓存排除。如果想要进行这两项的配置,那么还需要使用到特定的SpEL语法标记。
        缓存的逻辑:缓存空间现在没有任何数据项,通过数据层进行数据加载,随后直接拽入到缓存空间中。而有些数据不需要缓存,就需要设置一些缓存条件。

        例子1:下列例子中,使用name作为缓存的key,返回结果中的age字段大于18不进行缓存,name不包含abc才进行缓存

    @Cacheable(cacheNames = "name1",key="#name",unless = "#result.age>18",condition = "!#name.contains('abc')")public Future<String> getOrderName(String name);

        例子2:当有多个线程进行查询时,可能造成缓存穿透问题,在注解中开启同步缓存操作。

    @Cacheable(cacheNames = "name1",key="#name",sync = true)public Future<String> getOrderName(String name)

4、Caffeine

        使用ConcurrentHashMap实现缓存的处理性能不如Caffeine好,因为其内部在数据实现的结构上会更加优秀。

        步骤:一导依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.7.0</version>
</dependency>

        步骤二:配置

@Configuration
@EnableCaching
public class SpringCaffeineConfig {@Beanpublic CaffeineCacheManager cacheManager(){CaffeineCacheManager caffeineCacheManager=new CaffeineCacheManager();Caffeine<Object, Object> objectObjectCaffeine = Caffeine.newBuilder().maximumSize(100).expireAfterAccess(3L, TimeUnit.SECONDS);//最大缓存个数,访问三秒后失效caffeineCacheManager.setCaffeine(objectObjectCaffeine);//设置缓存caffeineCacheManager.setCacheNames(Arrays.asList("name"));//设置缓存名称return caffeineCacheManager;}}

        步骤三:在使用的地方打注解Cacheable,和上方类似。

        注:cacheNames 可以在类上进行配置公共的

@CacheConfig(cacheNames = "name1")
public class UserController

5、Caffeine更新缓存数据

        在缓存中保存的数据,非必要不做更新。这么做可能会造成缓存热点数据的失效,从而导致数据中的查询压力激增。

        实例:根据name更新数据,且返回结果不等于null

@CachePut(cacheNames = "name1",key="#name",unless = "#result==null")
public Future<String> getOrderName(String name)

6、Caffeine删除缓存

        缓存的数据应该于数据库之中的实体数据相对应,所以当数据库之中的数据被删除之后,对应的缓存的数据理论上也应该被删除,在SpringCahe考虑到数据删除的问题。
        实际上很多系统中实体数据已经不在了,而缓存数据还在,因为缓存的更新相比于实体数据更新慢,同时放在缓存之中的很多数据也一般不会轻易改变。
        可以使用"@CacheEvict"进行删除操作。例子:根据name删除缓存数据

@CacheEvict(key="#name") 
public Future<String> getOrderName(String name)

7、多级缓存更新、删除

        上述的缓存操作只能针对一个key值进行更新、删除缓存的操作,有时需要根据多个key值进行操作,就可以使用Cacheing注解进行配置。
        例子:缓存需要根据参数中的id和name进行更新缓存。(删除同理)

@Caching(put = {
@CachePut(cacheNames = "name1",key="#user.name",unless = "#result==null"),
@CachePut(cacheNames = "name1",key="#user.id",unless = "#result==null"),
})
public Future<String> getOrderName(User user)

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

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

相关文章

flutter TabBar指示器

第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…

C++入门(1)—命名空间、缺省参数

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种&#xff1a; 第二种&#xff1a; 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

生活总是自己的,请尽情打扮,尽情可爱,,

同色系拼接羽绒服了解一下 穿上时尚感一下子就突显出来了 90白鸭绒填充&#xff0c;不仅时尚还保暖 设计感满满的羽绒服不考虑一下吗?

腾讯云服务器租用价格,腾讯云服务器价格流量怎么算?

首先&#xff0c;让我们来看看腾讯云服务器租用价格。根据您的需求不同&#xff0c;腾讯云提供了多种不同的配置选项&#xff0c;从轻量级应用服务器到高性能的GPU服务器&#xff0c;都可以满足您的需求。以下是一些常见的腾讯云服务器租用价格&#xff1a; 一、腾讯云服务器租…

Mysql-复合查询

实际开发中往往数据来自不同的表&#xff0c;所以需要多表查询。 1.笛卡尔积 通俗来讲就是两个表的每一列都组合一遍&#xff0c;也就是穷举法。 穷举出来的数据表会有大量重复数据&#xff0c;而我们只需要加上一些限定条件就可以完成有效数据的筛选。 select EMP.ename, EM…

解决:虚拟机远程连接失败

问题 使用FinalShell远程连接虚拟机的时候连接不上 发现 虚拟机用的VMware&#xff0c;Linux发行版是CentOs 7&#xff0c;发现在虚拟机中使用ping www.baidu.com是成功的&#xff0c;但是使用FinalShell远程连接不上虚拟机&#xff0c;本地网络也ping不通虚拟机&#xff0c…

STM32 I2C详解

STM32 I2C详解 I2C简介 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 两根通信线&#xff1a; SCL&#xff08;Serial Clock&#xff09;串行时钟线&#xff0c;使用同步的时序&#xff0c;降低对硬件的依赖&#xff0c;同时同步的时序稳定…

【UE5】显示或隐藏物体轮廓线

效果 步骤 1. 先下载所需的材质文件“M_Highlight.uasset” 材质下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rxmRhkUoXVq6-DkIKyBhAQ 提取码&#xff1a;55bv 2. 在视口中拖入后期处理体积 根据需求设置后期处理体积的大小或者直接设置无限范围&…

python爬取网站数据,作为后端数据

一. 内容简介 python爬取网站数据&#xff0c;作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a; 三.主要流程 3.1 通过urllib请求网站 里面用的所有的包 ! pip install lxml ! pip install selenium ! pip install…

【Linux】U盘安装的cfg引导文件配置

isolinux.cfg文件 default vesamenu.c32 timeout 600display boot.msg# Clear the screen when exiting the menu, instead of leaving the menu displayed. # For vesamenu, this means the graphical background is still displayed without # the menu itself for as long …

计算两个图形遮盖率

读取图像 首先&#xff0c;加载待处理的图像&#xff0c;可以使用图像处理库&#xff08;例如OpenCV&#xff09;来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值&#xff0c;通…

深度学习中文汉字识别 计算机竞赛

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考&#xff1a;一篇文章教你使用Docker本地化部署Chatgpt&#xff08;非api&#xff0c;速度非常快&#xff01;&#xff01;&#xff01;&#xff09;及裸连GPT的方式&#xff08;告别镜像GPT&#xff09;-CSDN博客 前提是linux下 已安装docker 命…

Leetcode—142.环形链表II【中等】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—142.环形链表II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* …

2023.11.18 - hadoop之zookeeper分布式协调服务

1.zookeeper简介 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构&#xff0c;没有目录与文件之分,ZooKeeper树中的每个节点被…

阿里巴巴java开发手册-编程规约

编程规约 命名风格常量定义代码格式OOP 规约日期时间集合处理并发处理控制语句注释规约前后端规约其他 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始&#xff0c;也不能以下划线或美元符号结束。 反例&#xff1a;_name / name / n a m e / n a m e / n a m e…

Linux下安装部署redis(离线模式)

一、准备工作 1.下载redis的安装包 下载地址&#xff1a;Index of /releases/ 大家可以自行选择redis的版本&#xff0c;笔者选择的是最新的 2.上传到服务器 前提是我先在服务器上创建了一个目录redis7.2.3&#xff0c;我直接上传到这个目录下 二、安装redis 1.解压redis t…

RIP路由信息协议

RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议&#xff0c;最大优点是简单要求网络中的每个路由器都要维护一张表&#xff0c;表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议&#xff0c;它在传输层使用UDP&#xff0c;RIP报文作为UD…

[Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例

写在前面 先检查自己有没有安装使用wget的命令&#xff0c;没有的话输入下面命令安装&#xff1a; apt-get install wget -y查看gcc的安装 sudo apt install gcc #安装gcc gcc --version #查看gcc是否安装成功 #若上述命令不成功使用下面的命令尝试之后再执行上面…

算法通关村第十关-白银挑战数组最大K数

大家好我是苏麟 , 今天带来一道应用快排的题 . 数组中的第K个最大元素 描述 : 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 题目 : Le…