当前位置: 首页 > news >正文

对spring的@Cacheable缓存理解

1 什么是缓存

第一个问题,首先要搞明白什么是缓存,缓存的意义是什么。

对于普通业务,如果要查询一个数据,一般直接select数据库进行查找。但是在高流量的情况下,直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程是先要从磁盘拿到数据,再刷新到内存,再返回数据。磁盘相比于内存来说,速度是很慢的,为了提升性能,就出现了基于内存的缓存。

这种基于内存的缓存,由于无法跟磁盘频繁进行存储,所以无法保证数据的完整性,随时有可能丢失,所以架构一般使用数据库加缓存的方式,数据库用来持久化数据,缓存用来处理大流量。

2 本地缓存和集中式缓存

缓存按照存储方式可以分为这本地缓存和集中式缓存。

本地缓存顾名思义就是存储在本地上,例如静态变量就可以说是一种本地缓存,存储在了JVM中,或者说自己本地搭建的项目用的redis也算是本地缓存,因为缓存和应用都在一台机器上。

本地缓存效率很高,直接读取内存,没有网络延迟,但是可用性很低,因为出现单点故障的话,数据库和系统都会宕机。

对于大型项目来说,都会有集中式缓存,例如redis集群。缓存和应用服务器是分离的,服务器需要通过网络请求从缓存获取数据,一般应用服务器也会采取集群的方式,这样可以保证高可用,数据不易丢失,而且也能保证各个服务器的缓存数据一致。

对于分布式应用来说,本地缓存还会出现缓存不一致的问题,因为每个服务器的本地缓存都是独立的。

3 本地缓存的优点

刚才说了这么多本地缓存的缺点,那为什么还要用呢?

因为如果都放在集中式缓存中,网络延迟会成为性能的瓶颈。因为不在本地内存,读取的时间需要加上网络通信的时间。所以在对性能要求更大或者缓存内容不需要持久化、不需要一致性的情况下,本地缓存更适合。

所以一般的大型项目都采用本地缓存和集中式缓存混合使用的方式。

4 Spring对于缓存的支持

终于说到正题,本地缓存可以通过spring更简单的管理和使用。

springboot和springmvc都支持缓存,其中CacheManager是Spring提供的缓存接口。

4.1 spring支持的CacheManager

CacheManager

描述

SimpleCacheManager

使用简单的 Collection 来存储缓存,主要用于测试

ConcurrentMapCacheManager

使用 ConcurrentMap 来存储缓存

NoOpCacheManager

仅测试用途,不会实际缓存数据

EhCacheCacheManager

使用 EhCache 作为缓存技术

GuavaCacheManager

使用 Google Guava 的 GuavaCache 作为缓存技术

HazelcastCacheManager

使用 Hazelcast 作为缓存技术

JCacheCacheManager

支持 JCache(JSR-107) 标准的实现作为缓存技术,如 ApacheCommonsJCS

RedisCacheManager

使用 Redis 作为缓存技术

看着非常多,实际上正常用的只有ConcurrentMapCacheManager,EhCacheCacheManager,GuavaCacheManager(一般使用redis,我们需要更灵活的对redis键值进行操作,所以不用RedisCacheManager),我们重点去讲一下这个GuavaCacheManager。

4.2 GuavaCache

Guava是谷歌开源的Java库,其中的代表就有这个缓存。

GuavaCache的原理大概是LRU+ConcurrentHashMap,加载在JVM的本地缓存

4.3 引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version>
</dependency>
//有可能需要这个
<dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.2.5.RELEASE</version>
</dependency>

4.4 创建配置类

@EnableCaching
@Configuration
public class GuavaCacheConfig {@Beanpublic CacheManager cacheManager() {GuavaCacheManager cacheManager = new GuavaCacheManager();cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(3, TimeUnit.MINUTES));return cacheManager;}
}

@EnableCaching用来开启注解功能,这里设置的失效时间是3分钟。

Guava Cache 除了代码中提到的设置缓存过期时间的策略外,还有其他的策略。下面是 Guava Cache 设置缓存过期时间的策略:

  • expireAfterAccess: 当缓存项在指定的时间段内没有被读或写就会被回收。

  • expireAfterWrite:当缓存项在指定的时间段内没有更新就会被回收,如果我们认为缓存数据在一段时间后数据不再可用,那么可以使用该种策略。

  • refreshAfterWrite:当缓存项上一次更新操作之后的多久会被刷新。

4.5 缓存注解

标题终于出现了

注解

解释

@Cacheable

在方法执行前 Spring 先查看缓存中是否有数据,若有,则直接返回缓存数据;若无数据,调用方法将方法返回值放入缓存中

@CachePut

无论怎样,都会将方法的返回值放到缓存中。

@CacheEvict

将一条或多条数据从缓存中删除

@Caching

可以通过 @Caching 注解组合多个注解策略在一个方法上

我这里就主要解释下@Cacheable的用法,因为这个比较常见(其他的我也没用过)

4.6 @Cacheable的用法

常用参数有

参数

解释

value

名字1

key

名字2

condition

条件判断,condition="#id>1"表示id大于1的才缓存

unless

条件判断 ,unless="#id==1"表示id等于1的不缓存

#代表的是EL表达式

这里的key和value和我们以为的缓存键值对是不一样的

value+key 只是我们缓存键的名字,真正的值是方法的返回值。

举一个例子

 @Cacheable(value = "olympic_match_new_action",key = "'get_relate_news_'+#rsc")public List<MatchNewsVO> getRelateNews(String rsc){....       }

一般value取service名,key取方法名,取名按照数据库的下划线方式。后面那个#rsc指的是传进来的参数,这些都是键。返回的List就是缓存的值。

5 @Cacheable失效的原因

在配置正常的情况下,本人亲历的失效原因就是一个类的方法调用了带有缓存的方法,结果缓存失效。

我使用service的A方法,想调用这个service的缓存B方法,这样是不行的。

原因是@Cacheable是由AOP代理实现,生成了带有缓存的代理类。其他类想调用这个类的缓存方法时,会去调用这个代理类的方法,实现缓存功能。但是类内部调用这个方法,就不会去调用代理类的方法,导致缓存失效

6 总结

网上关于spring本地缓存的文章很少很杂,我稍微总结了一下发了出来,有自己的理解也有网上的摘抄。难免会有错误,希望大家指正

相关文章:

对spring的@Cacheable缓存理解

1 什么是缓存第一个问题&#xff0c;首先要搞明白什么是缓存&#xff0c;缓存的意义是什么。对于普通业务&#xff0c;如果要查询一个数据&#xff0c;一般直接select数据库进行查找。但是在高流量的情况下&#xff0c;直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程…...

力扣-市场分析

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1158. 市场分析二、解题1.错误示范①提交SQL运行结果2.正确示范①提交SQL运行结果3.错误示范②提交SQL运行结果4.正确示范②提交SQL运行结果5.其他总结前…...

【2357. 使数组中所有元素都等于零】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个非负整数数组 nums 。在一步操作中&#xff0c;你必须&#xff1a; 选出一个正整数 x &#xff0c;x 需要小于或等于 nums 中 最小 的 非零 元素。nums 中的每个正整数都减去 x。 返回使 n…...

什么品牌的游戏蓝牙耳机比较好?玩游戏延迟低的蓝牙耳机推荐

游戏耳机的出现其实最主要的作用就是让玩家能够更专注的沉浸在游戏世界内&#xff0c;在声音层面去享受游戏的沉浸感&#xff0c;游戏最重要的就是操作灵敏&#xff0c;需要快速通过声音来判断敌人走向&#xff0c;所以小编特意整理了一期玩游戏延迟低的蓝牙耳机。 一、南卡小…...

day 33 状态压缩dp

二维状态压缩dp对于解决哈密顿回路问题的状态压缩dp只能计算固定起点到其他点的总方案数或最小路径等回路计数小蓝现在在第一栋教学楼&#xff0c;他想要访问每栋教学楼正好一次&#xff0c;最终回到第一栋教学楼&#xff08;即走一条哈密尔顿回路&#xff09;可看做&#xff1…...

扬帆优配|超3600股飘绿,人民币贬值近300点!外资净卖近38亿

今天早盘&#xff0c;A股整体震动调整&#xff0c;白马蓝筹股体现较弱&#xff0c;上证50、沪深300指数均跌超1%。 盘面上&#xff0c;国防军工、造纸、数字钱银、IT设备等板块逆势活跃&#xff0c;酿酒、酒店餐饮、钙钛矿电池、有色等板块跌幅居前。两市半日成交4577亿&#x…...

【编程基础之Python】6、Python基础知识

【编程基础之Python】6、Python基础知识Python基础知识Python的基本要素模块语句表达式注释Python的代码格式Python基础知识 Python 是一种高级的、动态的、解释型的编程语言&#xff0c;具有简单易学、开发效率高、可读性强等特点&#xff0c;广泛应用于数据科学、Web 开发、…...

selenium基本操作

爬虫与反爬虫之间的斗争爬虫&#xff1a;对某个网站数据或图片感兴趣&#xff0c;开始抓取网站信息&#xff1b;网站&#xff1a;请求次数频繁&#xff0c;并且访问ip固定&#xff0c;user_agent也是python&#xff0c;开始限制访问&#xff1b;爬虫&#xff1a;通过设置user_a…...

思科设备命令讲解(超基础二)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

HTML基础(3)

HTML基础单选框、复选框、下拉框文本框< script >标签属性< script >基本使用单选框、复选框、下拉框 文本框 < script >标签属性 type属性定义script元素包含或src引用的脚本语言。属性值是MIME类型&#xff0c;包括text/javascript,text/ecmascript, appl…...

鸿蒙3.0 APP混合开发闪退问题笔记

APP采用cordova混合开发&#xff0c; 鸿蒙2.0以及安卓操作系统正常使用&#xff0c;但是在鸿蒙3.0中出现APP闪退&#xff0c;对APP进行真机调试发现&#xff0c;鸿蒙3.0系统对crosswork插件存在兼容问题&#xff0c;这些问题会导致APP页面加载失败&#xff0c;进而导致App闪退测…...

批量操作文件功能-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-1】 批量操作文件功能 任务介绍 1&#xff0e;任务描述 在日常工作中&#xff0c;经常会遇到批量操作系统文件的事情&#xff0c;通常情况下&#xff0c;只能手动重复的完成批量文件的操作&#xff0c;这样很是费时费力。本案例要求编写一个文件管理器&#xff0c;…...

Hadoop3.3.1完全分布式部署

Hadoop目录Hadoop3.3.1完全分布式部署(一)1、HDFS一、安装1、基础安装1.1、配置JDK-181.2、下载并解压hadoop安装包本地运行模式测试 eg:2、完全分布式运行模式1、概要&#xff1a;2、编写集群分发脚本&#xff0c;把1~4步安装的同步到其他服务器&#xff1a;2.1、创建脚本vim …...

SpringMVC中的注解

SpringMVC中的注解 文章目录SpringMVC中的注解RequestMapping注解RequestMapping中的value属性RequestMapping中的method属性派生类PathVariable注解RequestParam注解RequestMapping注解 RequestMapping中的value属性 RequestMapping&#xff1a;既可以标识在方法上也可以标识…...

python+Vue学生作业系统 django课程在线学习网站系统

系统分为学生&#xff0c;教师&#xff0c;管理员三个角色&#xff1a; 学生功能&#xff1a; 1.学生注册登录系统 2.学生查看个人信息&#xff0c;修改个人信息 3.学生查看主页综合评价&#xff0c;查看今日值班信息 4.学生在线申请请假信息&#xff0c;查看请假的审核结果和请…...

CSS 美化网页元素【快速掌握知识点】

目录 一、为什么使用CSS 二、字体样式 三、文本样式 color属性 四、排版文本段落 五、文本修饰和垂直对齐 1、文本装饰 2、垂直对齐方式 六、文本阴影 七、超链接伪类 1、语法 2、示例 3、访问时&#xff0c;蓝色&#xff1b;访问后&#xff0c;紫色&#xff1b; …...

Tableau连接openGauss实践

目录 一、摘要 二、什么是Tableau&#xff1f; 三、安装Tableau 四、安装ODBC驱动 1、openGauss数据库 2、连接前置条件 3、Tableau连接openGauss方式一 4、Tableau连接openGauss方式二 一、摘要 Tableau可以连接到多种数据库&#xff0c;包括关系型数据库&#xff0…...

RabbitMQ 实现延迟队列

业务场景&#xff1a;1.生成订单30分钟未支付&#xff0c;则自动取消&#xff0c;我们该怎么实现呢&#xff1f;2.生成订单60秒后,给用户发短信1 安装rabbitMqwindows安装ubuntu中安装2 添加maven依赖<!-- https://mvnrepository.com/artifact/org.springframework.boot/spr…...

Spring Bean 生命周期,好像人的一生

简单说说IoC和Bean IoC&#xff0c;控制反转&#xff0c;想必大家都知道&#xff0c;所谓的控制反转&#xff0c;就是把new对象的权利交给容器&#xff0c;所有的对象都被容器控制&#xff0c;这就叫所谓的控制反转。 控制反转 Bean&#xff0c;也不是什么新鲜玩意儿&#xf…...

C++算法基础课 05 —— 数据结构1_单链表/双链表/栈/单调栈/队列/单调队列/KMP

文章目录 1. 单链表(用数组模拟链表)1.1 模板1.1.1 插入操作1.1.2 删除操作1.2 习题1 —— 826.单链表2. 双链表2.1 模板2.1.1 插入操作2.1.2 删除操作2.2 习题1 —— 827.双链表3. 栈(用数组模拟栈)3.1 模板3.2 习题1 —— 828.模拟栈4. 单调栈4.1 模板4.2 习题1 —— 830.单调…...

用CT001解读Type-C线材设计:为什么只有一个CC灯亮?

拿到POWER-Z CT001测试仪&#xff0c;很多用户第一次测试C to C线材时&#xff0c;都会产生一个疑问&#xff1a;为什么线材明明能正常充电&#xff0c;CT001上却只有一个CC指示灯亮起&#xff1f;另一个CC对应的位置始终不亮&#xff0c;是线材有问题吗&#xff1f; 答案很明确…...

Python AOT编译成本控制实战:2026年前必须掌握的7项硬核降本技术(含CPython 3.15+原生支持验证数据)

第一章&#xff1a;Python AOT编译成本控制的战略定位与2026技术拐点Python长期以来以解释执行和动态特性见长&#xff0c;但其运行时开销与启动延迟在云原生边缘计算、实时AI推理及嵌入式服务场景中日益成为瓶颈。AOT&#xff08;Ahead-of-Time&#xff09;编译正从实验性探索…...

电机轴承异响?5分钟教你用振动分析仪定位故障(附实测案例)

电机轴承异响诊断实战&#xff1a;振动分析仪操作全流程解析 轴承异响是工业现场最常见的电机故障之一&#xff0c;但很多维护工程师面对"嗡嗡"声或"咔嗒"响往往无从下手。上周某化工厂的水泵电机就因轴承早期磨损未被及时发现&#xff0c;导致整机报废&am…...

OpenClaw配置文件详解:Qwen3.5-9B高级参数调优手册

OpenClaw配置文件详解&#xff1a;Qwen3.5-9B高级参数调优手册 1. 为什么需要手动调优OpenClaw配置 上周我尝试用OpenClaw自动处理一批技术文档的归档工作&#xff0c;发现同样的任务在不同时段完成速度差异巨大。有时30分钟就能搞定&#xff0c;有时却要卡顿近2小时。这促使…...

用九齐单片机NY8B062F定时器实现精准延时与系统时基:从4ms中断到1秒计时的完整工程实践

九齐单片机NY8B062F定时器工程实战&#xff1a;构建高精度时基与延时系统 在嵌入式系统开发中&#xff0c;定时器如同设备的心跳&#xff0c;为各类功能提供精准的时间基准。九齐NY8B062F作为一款高性价比8位单片机&#xff0c;其四组灵活配置的定时器资源尤其适合小家电、智能…...

数据科学家稳健统计系列第一部分:稳健的中心趋势度量以及...

原文&#xff1a;towardsdatascience.com/robust-statistics-for-data-scientists-part-1-resilient-measures-of-central-tendency-and-67e5a60b8bf1 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cf43c75d8b50af4d9c13df54abeccde8.pn…...

探索PLECS仿真下DAB变换器峰值电流前馈控制策略——IEEE顶刊复现之旅

PLECS仿真&#xff0c;IEEE顶刊复现&#xff0c;DAB变换器峰值电流前馈控制策略。最近在电力电子领域的研究中&#xff0c;我深入钻研了DAB&#xff08;Dual - Active - Bridge&#xff09;变换器的相关控制策略&#xff0c;并通过PLECS仿真实现了IEEE顶刊论文里一种峰值电流前…...

短视频 SEO 优化能给企业带来什么好处_短视频 SEO 如何优化视频标题和描述

短视频 SEO 优化能给企业带来什么好处_短视频 SEO 如何优化视频标题和描述 在当今数字化时代&#xff0c;短视频平台已经成为了企业营销和品牌推广的重要渠道。短视频的传播范围和影响力远不止于视频内容本身&#xff0c;背后的搜索引擎优化&#xff08;SEO&#xff09;策略同…...

嵌入式ONPS协议栈:轻量级TCP/IP实现与优化

1. ONPS协议栈概述ONPS是一款专为资源受限的嵌入式系统设计的开源网络协议栈&#xff0c;由国内开发者完全自主开发实现。作为一名长期从事嵌入式网络开发的工程师&#xff0c;我第一次接触ONPS时就对其轻量级设计和完整的功能实现印象深刻。与常见的LwIP等协议栈相比&#xff…...

上市公司数字化转型指数(2007-2024)Word2Vec扩充+TF-IDF

上市公司数字化转型指数&#xff08;2007-2024&#xff09;Word2Vec扩充TF-IDF数据名称&#xff1a;A股上市公司数字化转型指数 时间跨度&#xff1a;2007年-2024年 数据格式&#xff1a;Excel表格&#xff08;dta可直接导入&#xff09; 包含指标&#xff1a;股票代码、年份、…...