java中Cache缓存的使用

article/2025/9/1 20:27:53

java中Cache缓存

1.JSR107

在这里插入图片描述

缓存的整体架构:

在这里插入图片描述

2.SpringBoot的缓存抽象

在这里插入图片描述

几个重要概念以及缓存注解

在这里插入图片描述

其中想要使用缓存直接,就必须开启**@EnableCaching**注解

开启缓存注解的步骤:

作为Spring框架的核心功能之缓存注解,该功能也继承了Spring这个优良特性,使它生效只需要轻松两步:

1.配置类上开启缓存注解支持:@EnableCaching

2.向容器内至少放置一个CacheManager类型的Bean

这样就可以开工使用Spring强大的缓存注解功能了。

@EnableCaching
@Configuration
public class CacheConfig {@Beanpublic ConcurrentMapCacheManager cacheManager() {ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();//cacheManager.setStoreByValue(true); //true表示缓存一份副本,否则缓存引用return cacheManager;}
}

@Cacheable

@Cacheable  //对方法结果能够放入缓存中,比如若根据id查找user时,会将返回的结果放进换缓存中,如果下一次再进行相同操作,便不会调用方法,而是直接从缓存中获取结果值
public User getUser(Integer id);

@CacheEvict:能够清空缓存

@CachePut

@CachePut  //能够更新缓存的值,加上这个注解每次更新缓存的时候都会调用这个方法,然后将更新的结果返回到缓存中
public User updateUser(User user);

实例:

@CacheConfig(cacheNames = "emp")  //抽取缓存的公共配置
@Service
public class EmployeeService {@AutowiredEmployeeMapper employeeMapper;/** 将方法的运行结果进行缓存,以后再要相同的数据就直接从缓存取,不用再次调用这个方法* CacheManager管理多个cache组件,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一的名字* 几个属性:*       cacheName/value:指定缓存组件的名字;将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存;*       key:缓存数据使用的key;可以用它来指定,若果不指定,默认使用方法参数的值(比如id传入1:则 key-value为   1-方法的返回值)*           编写SqEL:#id:参数id的值   #a0  #p0 #root.args[0]   这几个效果都是一样的,取出第一个参数,作为key*           key = "#id"*       keyGenerator:key的生成器;可以自己指定key的生成器的组件id*       key/keyGenerator二选一使用*       CacheManager:指定缓存管理器  或者使用CacheResolver缓存解析器*       condition:指定符合条件的情况下才缓存;*           condition = "#id>0"*       unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存,可以获取到结果进行判断*           unless = "#result==null"*       sync:是否使用异步模式*原理:*   1.自动配置类:CacheAutoConfiguration*   2.缓存的配置类*   。。。。。。*   3.哪个配置类默认生效:SimpleCacheConfiguration*   4.给容器中注册了一个CacheManager:ConcurrentMapCacheManager*   5.可以获取和创建ConcurrentMapCache类型的缓存组件;他的作用将数据保存在ConcurrentMap中**   运行的流程:*       @Cacheable:*       1.方法运行之前,先去插叙Cache(缓存组件),按照cacheNames指定的名字获取;*           (CacheManager先获取相应的缓存),第一次获取缓存如果没有找到指定的Cache组件,会自动创建出来*       2.去Cache中查找缓存的内容,使用一个key,默认就是方法的参数;*         key是按照某种策略生成的;默认是使用KeyGenerator生成的,默认使用SimpleKeyGenerator生成key*           SimpleKeyGenerator生成策略:*               如果方法没有参数,key=new SimpleKey()*               方法有一个参数,key=参数的值*               方法有多个参数,key=new SimpleKey(params)*       3.没有查到缓存就调用目标方法;*       4.将目标方法返回到结果,放进缓存中**       @Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,如果有,就从缓存中获取不会调用方法,*       如果没有,就调用这个方法并将方法结果放到缓存中,以后再来调用就可以直接使用缓存中的数据。**       核心:*           1)、使用CacheManager【默认:ConcurrentMapCacheManager】按照名字得到Cache【默认:ConcurrentMapCache】组件*           2)、key使用KeyGenerator生成的,默认是SimpleKeyGenerator* */@Cacheable(cacheNames = "emp"/*, keyGenerator = "myKeyGenerator"*/)public Employee getEmp(Integer id) {System.out.println("查询" + id + "号员工");Employee emp = employeeMapper.getEmployeeById(id);return emp;}@Cacheable(/*cacheNames = "emp",*/key = "#employee.id")public Employee insertEmp(Employee employee){System.out.println("InsertEmp:"+employee.getId());employeeMapper.insertEmployee(employee);return employee;}/** @CachePut:既调用方法,又更新缓存数据;同步更新缓存* 修改了数据库的某个数据,同时更新缓存;* 运行时机:*   1、先调用目标方法*   2、将目标方法的结果缓存起立** 测试步骤:*   1、查询1号员工;查到的结果会放到缓存中*   2、以后查询还是之前的结果*   3、更新1号员工:【lastName=zhangsan; gender=0】*       将方法的返回值也放进了缓存:*           key:传入的对象  值:返回的employee对象;*   4、查询1号员工?* */@CachePut(/*value = "emp",*/ key = "#result.id")public Employee updataEmp(Employee employee) {System.out.println("updateEmp:" + employee);employeeMapper.updataEmployee(employee);return employee;}/** @CacheEvict:缓存清除*   key:指定要清除的数据*   allEntries=true:默认为false,设置为true,当删除缓存数据时,便会删除指定缓存中的所有数据*   beforeInvocation(布尔型):缓存的清除是否在方法之前执行*       false(默认值):代表在方法执行之后执行;如果该方法运行时出现异常缓存就不会清除*       true:代表在方法执行之前执行;如果该方法运行时出现异常,缓存也会被清除* */@CacheEvict(/*value = "emp",*/key = "#id")public void deleteEmp(Integer id){System.out.println("deleteEmp:"+id);
//        employeeMapper.deleteEmployeeById(id);}//@Caching定义复杂的缓存规则@Caching(cacheable = {@Cacheable(/*value = "emp",*/ key = "#lastName")},put = {@CachePut(/*value = "emp",*/key = "#result.id"),@CachePut(/*value = "emp",*/key = "#result.email")})public Employee getEmpByLastName(String lastName){return employeeMapper.getEmpByLastName(lastName);}
}

http://chatgpt.dhexx.cn/article/bkhEJQOT.shtml

相关文章

JAVA缓存的实现

缓存可分为二大类: 一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式; 二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查. 下面为一个简单的缓…

java缓存技术的介绍

一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache 二、缓存的分类 1、基于we…

Java缓存介绍

一、缓存 1、什么是缓存? 缓存是硬件,是CPU中的组件,CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达…

Java实现本地缓存、分布式缓存及多级缓存

以下均为自己参考其它博主文章或自己理解整理而成,如有错误之处,欢迎在评论区批评指正! 0. 缓存简介 像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景&a…

Java本地高性能缓存的几种实现方式

Java缓存技术可分为远端缓存和本地缓存,远端缓存常用的方案有著名的redis和memcache,而本地缓存的代表技术主要有HashMap,Guava Cache,Caffeine和Encahche。本篇博文仅覆盖了本地缓存,且突出探讨高性能的本地缓存。 本…

SIFT的两个版本:OpenCV和VL_SIFT

暂时记录一下 OpenCV版本&#xff1a; #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/core.hpp> #include<opencv2/features2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp>using namespace std; using namespace c…

论文阅读笔记《Matching Images With Multiple Descriptors: An Unsupervised Approach for Locally Adaptive》

核心思想 本文提出一种将多种特征描述算法融合起来实现更好图像匹配的方法。近些年来&#xff0c;图像特征的描述算法层出不穷如SIFT、LIOP 、DAISY等等&#xff0c;每种方法都有各自的优势和侧重点&#xff0c;对于不同图像其效果也各有优劣。那么能不能将多种算法的优势结合起…

LIFT: Learned Invariant Feature Transform详细笔记

LIFT: Learned Invariant Feature Transform Paper: LIFT: Learned Invariant Feature Transform | SpringerLink Code: GitHub - cvlab-epfl/LIFT: Code release for the ECCV 2016 paper 文章目录 Abstract思路来源LIFT文献来源 方法&#xff1a;LIFTPipeline网络架构训练流…

简单的倒计时shell脚本

效果如下: 代码如下: #! /bin/bash #####################倒计时################ #作者:liop #完成时间:2019.12.17 #三位数以内秒数的倒计时 ########################################## display(){case $1 in1)case $2 in1)echo "******** ";;2)echo "…

计算机视觉领域经典论文源码

计算机视觉领域经典论文源码 转载自&#xff1a;http://blog.csdn.net/ddreaming/article/details/52416643 2016-CVPR论文代码资源&#xff1a; https://tensortalk.com/?catconference-cvpr-2016 一个GitHub账号&#xff0c;里面有很多计算机视觉领域最新论文的代码实现&am…

【译文】Local Intensity Order Pattern for Feature Description

在上一篇文章【特征检测】LIOP特征描述算法中讲到了LIOP描述符&#xff0c;下面我将原文翻译如下&#xff0c;如有出入请以原文为准。 —————————————————————————————————————————————————————————————————…

[2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103610331 翻译 本地图像描述…

[2015 Springer] Local Image Descriptor: Modern Approaches——3 Intensity Order-Based Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/10361…

在SIFT和SURF之后,有哪些比较新的且具有一定影响力的自然图像配准算法?

链接&#xff1a;https://www.zhihu.com/question/32066833/answer/2041516754 编辑&#xff1a;深度学习与计算机视觉 声明&#xff1a;仅做学术分享&#xff0c;侵删 作者&#xff1a;Vinjn张静https://www.zhihu.com/question/32066833/answer/54575191 我就提一下 OpenCV 中…

matlab vlfeat hog,vlfeat-0.9.20-bin 特征提取的工具包,实现各种 ,如hog,lbp,sift. matlab 242万源代码下载- www.pudn.com...

文件名称: vlfeat-0.9.20-bin下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 17828 KB 上传时间: 2015-07-21 下载次数: 0 提 供 者: 刘晓晶 详细说明&#xff1a;特征提取的工具包&#xff0c;实现各种特征&#xff0c;如hog,lbp,sift.-Feature extraction kit …

关于视觉SLAM的最先进技术的调查-A survey of state-of-the-art on visual SLAM

原文见文章末尾&#xff1a; 今天读了一篇视觉slam的综述&#xff0c;真的是读了一天&#xff0c;记录一下。我比较关注的是特征提取和匹配和深度学习有关的章节。好久&#xff0c;但是还算是有收获的吧。 摘要&#xff1a; 本文概述了视觉同步定位和测绘&#xff08;V-SLAM&a…

队列

目录 队列的概念及结构队列代码实现 队列的概念及结构 队列和栈略有不同&#xff0c;队列是先进后出的一种数据结构&#xff0c;通常使用链表来表示&#xff0c;当然有一种特殊的循环队列使用顺序表来进行表示的。 队列只允许从后进入&#xff0c;从前弹出&#xff0c;就像我们…

HPatches数据集(图像匹配)---2关于评估代码的解释---和python画出结果

关于画图: 参考: Matplotlib系列: https://blog.csdn.net/yuyh131/category_7823048.html 关于评估代码的解释: 我们先提前下载所有算法对数据集patches提取的描述符: ./download.sh descr List of available descriptor results file for HPatches: ----------------------…

LIOP特征

注&#xff1a;本文是笔者在阅读相关英文文献后&#xff0c;翻译、整理所得&#xff1b;原文是&#xff1a;Local Intensity Order Pattern for Feature Description&#xff1b; Zhenhua Wang, Bin Fan, and Fuchao Wu&#xff1b;ICCV2011 LIOP: Local Intensity Order Patte…

【特征检测】LIOP特征描述算法

简介&#xff1a; LIOP特征描述算法&#xff0c;是2011年ICCV上一片paper《Local Intensity Order Pattern for Feature Description》中提出的一种特征描述算法。等有空闲时间把原文仔细翻译一遍&#xff0c;然后放上来分享给大家。 算法的提出者也是比较厉害的&#xff0c;其…