Spring Cache框架(AOP思想)+ Redis实现数据缓存

news2024/12/25 12:21:41

文章目录

  • 1 简介
    • 1.1 基本介绍
    • 1.2 为什么要用 Spring Cache?
  • 2 使用方法
    • 2.1 依赖导入(Maven)
    • 2.2 常用注解
    • 2.3 使用步骤
    • 2.4 常用注解说明
        • 1)@EnableCaching
        • 2)@CachePut
        • 3)@Cacheable
        • 4)@CacheEvict
  • 3 注意事项

1 简介

1.1 基本介绍

Spring Cache 是 Spring 框架提供的一个抽象层,通过 Spring Cache,你可以将缓存逻辑与业务代码分离,减少对底层缓存实现的依赖。Spring Cache 支持多种缓存提供者,如 EhCache、Redis、Caffeine、Guava 等。
Spring Cache 的核心概念:

  1. 缓存抽象 (Cache Abstraction)
    Spring Cache 通过抽象接口为各种缓存提供者提供支持。核心接口包括 CacheCacheManager
  2. Cache
    Cache 接口代表具体的缓存对象。它提供了对缓存数据的访问和管理操作,如获取、插入、删除缓存项。
  3. CacheManager
    CacheManager 是用于管理 Cache 实例的接口。它负责管理多个 Cache 实例,并提供访问这些缓存的机制。

1.2 为什么要用 Spring Cache?

使用 Spring Cache 主要是为了简化缓存管理,提高系统性能,并确保缓存的使用对开发者来说是透明和易于维护的。Spring Cache 的主要好处在于它提供了一个简单、透明且统一的缓存管理机制,可以显著提升应用的性能,同时减少了缓存实现的复杂性。它使得开发者能够更专注于业务逻辑,而不用担心底层缓存的细节,并且在系统扩展时,缓存策略也可以灵活调整。下面是使用 Spring Cache 的一些具体好处:

  1. 性能提升

缓存可以显著减少对资源密集型操作的依赖,如数据库查询或复杂计算。通过将频繁访问的结果存储在缓存中,可以减少这些操作的次数,从而提高系统的响应速度和吞吐量。

  • 减少数据库查询:将查询结果缓存起来,可以减少数据库的压力,尤其是在读操作较多的场景下。
  • 加快计算速度:一些复杂的业务逻辑计算结果可以缓存,避免每次都重新计算。
  1. 简化缓存管理

Spring Cache 提供了统一的缓存管理接口,开发者可以通过简单的注解来实现缓存功能,而不需要直接操作底层缓存框架。

  • 统一的缓存抽象:通过 CacheCacheManager 接口,Spring Cache 可以支持多种缓存实现,开发者无需关心底层实现的细节。
  • 简化的配置:只需使用如 @Cacheable@CachePut 等注解,就可以轻松实现缓存的添加、更新和删除。
  1. 透明的缓存机制

Spring Cache 使得缓存的使用对业务逻辑透明,开发者不需要修改现有代码逻辑,只需在需要缓存的地方加上注解即可。这种透明性极大地减少了缓存逻辑与业务逻辑的耦合。

  • 非侵入性:Spring Cache 通过 AOP(面向切面编程)机制将缓存逻辑与业务逻辑分离,不影响原有代码的可读性和维护性。
  • 便捷性:开发者不需要手动处理缓存的增删查改,只需专注于业务逻辑。
  1. 灵活性和扩展性

Spring Cache 支持多种缓存提供者,如 EhCache、Redis、Caffeine 等,可以根据不同的应用场景选择合适的缓存实现。此外,Spring Cache 还支持缓存的条件控制、缓存键的自定义等高级特性。

  • 多缓存支持:可以无缝切换或组合多种缓存提供者,根据业务需求灵活配置。
  • 条件缓存:通过 conditionunless 等属性,开发者可以精确控制缓存的行为,避免不必要的缓存。
  1. 集成与维护方便

Spring Cache 与 Spring 生态系统紧密集成,特别是与 Spring Boot 的集成非常方便,使得缓存的配置和管理更加简单。

  • Spring Boot 的自动配置:对于常用的缓存提供者,如 Redis,Spring Boot 提供了开箱即用的自动配置,减少了开发者的配置工作量。
  • 一致性管理:Spring Cache 可以与其他 Spring 组件(如 Spring Data、Spring Security 等)无缝集成,提供一致的缓存管理。
  1. 缓存更新和失效管理

Spring Cache 支持缓存的自动更新和失效机制,确保缓存数据与实际数据保持一致,避免脏数据的问题。

  • 缓存失效控制:通过 @CacheEvict 注解可以灵活地控制缓存的失效时间和条件,确保缓存的准确性。
  • 自动刷新:一些缓存实现支持缓存数据的自动刷新机制,避免数据过时的情况。
  1. 提高应用的扩展性

通过缓存减少资源的占用,使得应用在负载增加时能更好地扩展。此外,Spring Cache 的抽象层允许开发者轻松切换或扩展缓存策略,而不影响现有的业务逻辑。

2 使用方法

2.1 依赖导入(Maven)

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

2.2 常用注解

在SpringCache中提供了很多缓存操作的注解,常见的是以下的几个:

注解说明
@EnableCaching开启缓存注解功能,通常加在启动类上
@Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。例如,使用Redis作为缓存技术,只需要导入Spring Data Redis的maven坐标即可。

2.3 使用步骤

采用 SpringBoot+SpringCache+Redis+SpringData 实现数据的缓存小例子如下:

  1. 导入相关依赖,并在配置文件中配置好数据库+redis 等相关工具的必须信息。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
server:
  port: 8888
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/spring_cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: ****
      password: ****
  redis:
    host: localhost
    port: 6379
    database: 1
logging:
  level:
    com:
      itheima:
        mapper: debug
        service: info
        controller: info
  1. 在启动类中开启缓存注解功能,采用注解:@EnableCaching 打开cache缓存注解功能
@Slf4j
@SpringBootApplication
@EnableCaching // 打开cache缓存注解功能
public class CacheDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheDemoApplication.class, args);
        log.info("项目启动成功...");
    }
}
  1. 在 controller 层,请求方法上加上相关的注解实现不同的作用,具体见下代码注解。(代码见下节)

2.4 常用注解说明

1)@EnableCaching

在启动类中开启缓存注解功能。

2)@CachePut

作用:用于更新缓存中的数据。与@Cacheable不同,@CachePut每次都会调用实际的方法,并将其返回值放入指定的缓存中。
两个参数:

  • value:缓存的名称,每个缓存名称下面可以有很多的 key
  • key:缓存的 key,支持 spring 的表大师语言 SPEL 语法
// 当用户ID为1时最终缓存的结果为userCache::1
@PostMapping
@CachePut(value = "userCache", key = "#user.id") // 将返回值自动存入缓存,括号的参数代表的是key的生成定义,userCache::1
public User save(@RequestBody User user) {
    userMapper.insert(user);
    return user;
}

效果:
image.png

附加说明:key 的写法有多种
#user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key ;
#result.id : #result代表方法返回值,该表达式 代表以返回对象的id属性作为key ;
#p0.id:#p0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#a0.id:#a0指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数的id属性作为key ;
#root.args[0].id:#root.args[0]指的是方法中的第一个参数,id指的是第一个参数的id属性,也就是使用第一个参数
的id属性作为key ;

3)@Cacheable

作用:用于声明一个方法的返回值是可缓存的。当方法被调用时,Spring Cache会先检查缓存中是否已经存在相应的数据。如果存在,则直接返回缓存中的数据,而无需调用实际的方法。如果不存在,则调用方法并缓存其返回值。
两个重要参数:

  • value/cacheNames: 缓存的名称,每个缓存名称下面可以有多个key
  • key: 缓存的key ----------> 支持Spring的表达式语言SPEL语法
/**
 * 2、模拟查询请求,首先查找缓存是否存在该数据,没有就查库然后存入缓存,再返回
 */
@GetMapping
@Cacheable(cacheNames = "userCache", key = "#id")
public User getById(Long id) {
    User user = userMapper.getById(id);
    return user;
}

其他参数:

  1. value/cacheNames:这两个参数是互斥的,用于指定缓存的名称。你可以使用 valuecacheNames 来指定缓存的标识符。如果定义了多个缓存名称,则可以使用逗号分隔。Spring 将会根据这个名称去查找对应的 CacheManager 中的 Cache。
  2. key:指定缓存数据时使用的 key,可以是方法参数,也可以是 SpEL 表达式。如果未指定,Spring 将会使用默认的 key 生成策略。
  3. keyGenerator:用于指定 key 的生成器,当 key 参数不足以满足需求时,可以通过实现 org.springframework.cache.interceptor.KeyGenerator 接口来自定义 key 的生成策略。
  4. cacheManager:指定用于解析缓存名称的 CacheManager。如果未指定,将会使用 Spring Boot 自动配置的 CacheManager。
  5. cacheResolver:当需要动态解析缓存时,可以使用 cacheResolver。它允许你基于方法的参数或其他条件来选择不同的缓存。
  6. condition:SpEL 表达式,用于指定在什么条件下方法的结果应该被缓存。只有表达式结果为 true 时,才会缓存方法的返回结果。
  7. unless:与 condition 类似,但用于指定在什么条件下方法的结果不应该被缓存。只有当表达式结果为 false 时,方法的返回结果才会被缓存。
  8. sync:是否使用同步模式进行缓存。如果设置为 true,则对于同一个 key 的并发请求,只有一个能够更新缓存,其他请求则会等待缓存更新完成后再从缓存中获取数据。这个参数是 Spring Cache 的扩展,并非所有缓存提供者都支持。
4)@CacheEvict

作用:用于从缓存中移除数据。你可以指定根据某个条件来移除缓存中的数据,或者移除整个缓存。
参数:

  • value/cacheName:缓存的名称,每个缓存名称下面可以有多个 key
  • key:缓存的 key
  • allEntries:是否删除缓存名称下的所有 key 缓存

两种使用方法,适用于清除缓存数据的情况。具体使用见下:

/**
 * 3、模拟删除某一个数据的请求,同时清理指定的缓存信息
 */
@DeleteMapping
@CacheEvict(cacheNames = "userCache", key = "#id") // 删除某个具体的key对应的id
public void deleteById(Long id) {
    userMapper.deleteById(id);
}

/**
 * 4、模拟批量删除数据请求,同时清理某个类型的key下对应的所有缓存
 */
@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache", allEntries = true) // 删除userCache下对应的所有缓存
public void deleteAll() {
    userMapper.deleteAll();
}

3 注意事项

  1. 被缓存的方法的返回值需要是可序列化的,因为缓存数据通常会被存储在内存中或通过网络进行传输。
  2. 缓存的key通常是根据方法的参数来生成的,但你也可以通过@Cacheable等注解的key属性来自定义key的生成策略。
  3. 缓存的失效策略(如过期时间)通常由缓存实现来提供,而不是由Spring Cache直接控制。你需要根据所使用的缓存实现来配置相应的失效策略。
  4. SpringCache并不直接“知道”你使用的是Redis还是其他缓存实现,而是通过项目的依赖和配置信息来间接确定的。Spring Boot的自动配置机制会根据这些信息来选择合适的缓存管理器实现,并在你的业务代码中通过AOP机制来执行缓存操作。

上述完整项目代码仓库:StrivePeng仓库

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

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

相关文章

【云服务器】vscode + onethingAi + SSH远程连接

通过VS code远程连接服务器&#xff0c;并进行上传和下载文件操作_vs code 上传制定文件-CSDN博客 vscode远程连接服务器&#xff08;remote ssh&#xff09;上传本地文件到服务器(sftp)_vscode上传文件到服务器-CSDN博客 vscode连接远程服务器&#xff08;傻瓜式教学&#x…

批发行业手机开单-手机开单 电子单 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、手机开单的好处 批发行业的业务拓展总是在路上&#xff0c;而手机开单的出现成为了业务人员的得力助手。无论身处何地&#xff0c;都能轻松操作&#xff0c;迅速完成开单流程&#xff0c;大幅提高工作效率。而且&#xff0c;通过手机还能明确开单人身份&#xff0c;自动完…

KaiwuDB 产品总监李月飞:让中国物联网用上放心的数据库产品

​2024年7月17日&#xff0c;KaiwuDB 产品总监李月飞受邀于 2024 可信数据库发展大会“能源与政务数据库应用创新”分论坛发表演讲。以下是李月飞主题演讲《深耕数据良田&#xff0c;KaiwuDB 洞见能源产业数字新生力》精华实录。 数据&#xff0c;给能源变革带来新的可能 众所…

基于SpringCloud alibaba的流媒体视频点播平台

基于SpringCloud alibaba的流媒体视频点播平台 前言整体架构具体实现视频播放 总结 先把项目地址放这 》基于SpringCloud alibaba的流媒体视频点播平台《 然后咱们来看看这个项目是干啥的。 前言 今天和大家分享一个项目&#xff0c;基于SpringCloud alibaba的流媒体视频点…

46 集合对象的创建与删除

集合&#xff08;set&#xff09;属于 Python 无序可变序列&#xff0c;使用一对大括号作为定界符&#xff0c;元素之间使用逗号分隔&#xff0c;同一个集合内的每个元素都是唯一的&#xff0c;元素之间不允许重复。 集合中只能包含数字、字符串、元组等不可变类型&#xff08;…

吴恩达老师机器学习作业-ex7

导入库&#xff0c;读取数据&#xff0c;查看数据类型等进行分析&#xff0c;可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…

安防监控平台智能边缘分析一体机视频智能分析客流统计检测算法详细介绍

在当今数字化时代&#xff0c;数据的重要性不言而喻。特别是在零售、交通、安防等行业中&#xff0c;准确的客流统计数据对于业务决策、资源优化和安全管理至关重要。随着技术的进步&#xff0c;智能边缘分析一体机的出现为客流统计提供了一种高效、实时的解决方案。本文将详细…

【教育宝-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

windows下设置java环境变量

1.打开window的环境变量设置 右键开始菜单选择系统 选择高级系统设置&#xff1a; 点击环境变量 2.在系统变量 新增 JAVA_HOME&#xff1b;该变量的值 选择jdk所在的目录即可。 JAVA_HOME: D:\Program Files\Java\jdk1.8.0_131 3. 在系统变量新增 classpath; 该变量的值设置…

校园水电费管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;宿舍信息管理&#xff0c;学生缴费管理&#xff0c;教师缴费管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我的 开发系统…

MSA+抑郁症模型总结(三)(论文复现)

MSA抑郁症模型总结&#xff08;三&#xff09;&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 MSA抑郁症模型总结&#xff08;三&#xff09;&#xff08;论文复现&#xff09;热门研究领域&#xff1a;情感计算的横向发展一、概述二、论…

了解关于标准化的知识

1.标准化组织 1.1国家标准化管理委员会(Standardization Administration of the Peoples Republic of China&#xff0c;简称SAC) TC--(Technical Committee) 技术委员会. SAC/TC,就是“国家标准化管理委员会”下属的一个专项或一个行业的“技术委员会或技术小组”&a…

MySQL--查询数据

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。其基本格式为&#xff1a; select {* | <字段列表>}[from <表1>,&l…

食堂窗口自助点餐小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;店铺信息管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…

Oracle SQL Developer 连接第三方数据库

首先Oracle SQL Developer除了支持连接Oracle数据库外&#xff0c;还支持连接第三方数据库&#xff0c;包括&#xff1a; Amazon RedshiftHiveIBM DB2MySQLMicrosoft SQL ServerSybase Adaptive ServerPostgreSQLTeradataTimesTen 首先&#xff0c;你需要在菜单Tools > Pr…

pypinyin,一个有趣的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - pypinyin。 Github地址&#xff1a;https://github.com/mozillazg/python-pinyin 在处理中文文本时&#xff0c;拼音转换是一项常见的需求。拼音在自然…

图片打印---print-js,解决图片过长过宽,溢出分页问题

提示&#xff1a;打印图片 文章目录 [TOC](文章目录) 前言一、调取window.print二、print-js通过图片url打印三、print-js把图片转成html后调整尺寸再打印总结 前言 一、调取window.print printImage.vue <template><div class"print_img_fixed"> <…

读零信任网络:在不可信网络中构建安全系统07设备信任

1. 设备信任 1.1. 在零信任网络中建立设备信任至关重要&#xff0c;这也是非常困难的一个环节 1.2. 建立设备信任是基石&#xff0c;直接影响零信任网络架构的成败 1.3. 大多数网络安全事件都和攻击者获得信任设备的控制权相关&#xff0c;这种情况一旦发生&#xff0c;信任…

中山网站建设概述

随着互联网的发展&#xff0c;网站建设已经成为企业和个人在网络上展示自身形象和提供服务的重要途径。中山作为中国的重要城市之一&#xff0c;也在网站建设方面取得了很大的进步。网站建设不仅可以提高企业的知名度和竞争力&#xff0c;还可以提升用户体验&#xff0c;增加客…

Java swing项目汇总

Java swing项目汇总 序号项目名称1&#xff08;无需数据库&#xff09;swing推箱子小游戏2&#xff08;无需数据库&#xff09;swing学生基本信息管理系统3&#xff08;无需数据库&#xff09;仓库管理系统&#xff08;源码详细注释详细报告&#xff09;4&#xff08;无需数据…