SpringCache的基本使用方法

 更新时间:2024年01月16日 11:02:45   作者:Bunny0212  
Spring Cache利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了,本文介绍SpringCache的基本使用方法,感兴趣的朋友一起看看吧

概述

常见的缓存的框架有Redis、Memcached、Guava、Caffeine等等, 各有各的优势。如果我们的程序想要使用缓存,就要与这些框架耦合。聪明的架构师已经在利用接口来降低耦合了,利用面向对象的抽象和多态的特性,做到业务代码与具体的框架分离。但我们仍然需要显式地在代码中去调用与缓存有关的接口和方法,在合适的时候插入数据到缓存里,在合适的时候从缓存中读取数据。

Spring Cache利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了。而且Spring Cache也提供了很多默认的配置,用户可以3秒钟就使用上一个很不错的缓存功能。

SpringCache使用

常用注解

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

引入相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/>
    </parent>
    <groupId>com.itheima</groupId>
    <artifactId>springcache-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <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>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.3</version>
            </plugin>
        </plugins>
    </build>
</project>

使用步骤

配置文件

需要在配置文件中设置相关内容,Redis地址、MySQL地址等,使用SpringCache可以将返回或者请求内容自动存入Redis

server:
  port: 8888
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://XXXX:3305/springcachedemo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: root
      password: "02120212"
  redis:
    host: XXXX
    port: 6378
    password: "02120212"
    database: 0
logging:
  level:
    com:
      itheima:
        mapper: debug
        service: info
        controller: info

开始使用

1、开启缓存

需要在启动类上加上@EnableCaching 注解

2、设置缓存

设置缓存使用@CachePut 注解。如果需要将请求的内容放入缓存可以按照以下步骤实现。

设置键的格式为参数::参数,由于在Redis中可以设置树型结构。

关于Redis树型结构

如果需要设置Redis树型结构,可以设置键为

abc:bca:cba

这样设置在Redis中展现就像是树型,像是文件夹的目录结构。

适应不同用户的习惯,有多种方式获取参数,这里的cacheNames设置是

// TODO 2. 设置缓存数据值
@CachePut(cacheNames = "userCache", key = "#user.id")// 格式为 userCache::abc ;key = "#user.id" 中usr与下面user对应
@CachePut(cacheNames = "userCache",key = "#result.id")// #result.id 取到返回值id 对象导航
@CachePut(cacheNames = "userCache",key = "#p0.id")// 取到第一个参数,这里没有第二个参数所以取不到
@CachePut(cacheNames = "userCache",key = "#a0.id")// 取到第一个参数,这里没有第二个参数所以取不到
@CachePut(cacheNames = "userCache",key = "#root.args[0].id")// 取到第一个参数,这里没有第二个参数所以取不到
public User save(@RequestBody User user) {
    userMapper.insert(user);
    return user;
}

但是这也设置在Redis中会存在有个“文件夹”没有名字,因为接受的参数是内容:内容而在这的格式为内容::内容所以会有一个为空

在上面示例中,想获取传入的数值可以使用,如:user,获取里面的id可以使用user.id以此类推

所以在上面设置中显示的格式为userCache::id中的值

传入的值是单个

如果传入的值是一个,也可以按照这个方式去设置,效果和原理也是一样的。

@GetMapping
@Cacheable(cacheNames = "userCache", key = "#id")// TODO 3. 将key设置为 userCache::id
public User getById(Long id) {
    User user = userMapper.getById(id);
    return user;
}

那么在上面的示例中显示的格式为userCache::id的值

3、清理缓存

清理缓存使用注解@CacheEvict,使用格式为@CacheEvict(cacheNames = "userCache", key = "#id")

@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache", allEntries = true) // TODO 5. 清理所有数据将userCache所有都删除
public void deleteAll() {
    userMapper.deleteAll();
}

上述清理格式为userCache::id的值如果这个值存在就会被清除

4、清理所有数据将userCache所有都删除

如果想将所有的开头为userCache的缓存都清除可以使用@CacheEvict,和清除单个缓存一样。

示例:@CacheEvict(cacheNames = "userCache", allEntries = true)

只需要将参数改为allEntries并且设置为true即可

@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache", allEntries = true) // TODO 5. 清理所有数据将userCache所有都删除
public void deleteAll() {
    userMapper.deleteAll();
}

到此这篇关于SpringCache的基本使用方法的文章就介绍到这了,更多相关SpringCache使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java SimpleDateFormat线程不安全问题

    Java SimpleDateFormat线程不安全问题

    这篇文章详细介绍了如可解决impleDateFormat线程不安全的问题,对多线程问题感兴趣的同学可以参考阅读本文
    2023-03-03
  • springboot下添加日志模块和设置日志文件输出的方法

    springboot下添加日志模块和设置日志文件输出的方法

    日志的使用将通过SLF4J来使用,SLF4J是一个为Java应用提供简单日志记录的接口,在Spring框架中,SLF4J常常用于处理框架本身以及应用程序的日志记录,本文给大家介绍springboot下添加日志模块和设置日志文件输出的相关知识,感兴趣的朋友一起看看吧
    2023-12-12
  • Spring 使用 feign时设置header信息的操作

    Spring 使用 feign时设置header信息的操作

    这篇文章主要介绍了Spring 使用 feign时设置header信息的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Mybatis加载策略的实现方法

    Mybatis加载策略的实现方法

    Mybatis中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的订单信息,这是就是我们常说的延时加载,本文给大家详细介绍实现方法,一起看看吧
    2022-02-02
  • 详解MyBatis工作原理

    详解MyBatis工作原理

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,本文就详细总结了MyBatis工作原理,,需要的朋友可以参考下
    2021-05-05
  • java lambda循环_使用Java 8 Lambda简化嵌套循环操作

    java lambda循环_使用Java 8 Lambda简化嵌套循环操作

    这篇文章主要介绍了java lambda循环_使用Java 8 Lambda简化嵌套循环操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 浅析java中static的用法

    浅析java中static的用法

    这篇文章主要介绍了java中static的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • JavaWeb BeanUtils信息类原理详解

    JavaWeb BeanUtils信息类原理详解

    这篇文章主要介绍了JavaWeb BeanUtils信息类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java foreach循环的使用方法详解

    Java foreach循环的使用方法详解

    Java SE5引入了一种更加简洁的for语法用于数组和容器,即foreach语法,表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项,这种循环方式在我们后来遍历集合时很常用,所以也有必要来学习一下,需要的朋友可以参考下
    2023-05-05
  • MyBatis实现简单的数据表分月存储

    MyBatis实现简单的数据表分月存储

    本文主要介绍了MyBatis实现简单的数据表分月存储,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论