SpringCache缓存处理详解

 更新时间:2023年09月12日 09:38:25   作者:小钟要学习!!!  
这篇文章主要介绍了SpringCache缓存处理详解,SpringCache是一个框架,实现了基于注解缓存功能,只需要简单地加一个注解,就能实现缓存功能,需要的朋友可以参考下

SpringCache缓存处理

学习过redis的都知道redis缓存是一个很不错的nosql,对于上线项目正的有很大的帮助,平常在java中使用一般都是通过 jedis 或者 spring-boot-starter-data-redis 所提供的依赖进行开发,具体的api还需要我们手动的去调用实现,下面的SpringCache将会为我们使用注解的形式来快速使用redis

1、SpringCache介绍

SpringCache是一个框架,实现了基于注解缓存功能,只需要简单地加一个注解,就能实现缓存功能。 SpringCache提高了一层抽象,底层可以切换不同的cache实现,具体就是通过cacheManager接口来统一不同的缓存技术 cacheManager是spring提供的各种缓存技术抽象接口 针对不同的缓存技术需要实现不同的cacheManager接口

CacheManager描述
EhCacheCacheManager使用EhCache作为缓存技术
GuavaCaceManager使用Google的GuavaCache作为缓存技术
RedisCacheManager使用Redis作为缓存技术

2、Spring Cache常用注解

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

在springboot项目中,使用缓存技术只需要在项目中导入相关的缓存技术包,并在启动类上使用@EnableCaching注解开启缓存技术支持即可 例如:使用redis作为缓存技术,只需要导入spring-data-redis的maven坐标即可

3、SpringCache快速入门

下面几步的案例都是基于SpringCache底层的Map存储,当服务器重启的时候就会清空,在下面第4段的时候会讲解如何存储到redis

3.1、在启动类上开redis注解缓存技术

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching;
@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableCaching
public class ReggieApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.class);
    }
}

3.2、在控制器中注入CacheManager

/**
* 注入注解缓存接口
*/
@Autowired
private CacheManager cacheManager;

3.3、在具体的方法中使用注解完成缓存添加

这里的控制器使用的是mybatisplus框架提供的接口业务更具id修改数据。 对于注解的 key 是一个重点,详细的官方介绍如下

/**
* CachePut:将方法返回的值放入缓存中
* value:缓存的名称,每一个缓存名称下面可以有多个key
* key:缓存的key,重点灵活配置
*/
@CachePut(value = "userCache",key = "#users.id")
@GetMapping()
public User get(User user){
   User users= dishService.updateById(user);
     return users;
}

用于动态计算密钥的 Spring 表达式语言 (SpEL) 表达式。 默认为 {@code “”},这意味着所有方法参数都被视为一个键,除非已设置自定义 {@link keyGenerator}。 SpEL 表达式根据提供以下元数据的专用上下文进行评估: {@code result} 用于对方法调用结果的引用。对于 {@code Optional} 等受支持的包装器,{@code result} 指的是实际对象,而不是包装器 {@code root.method}、{@code root.target} 和 {@ code root.caches} 分别用于引用 {@link java.lang.reflect.Method 方法}、目标对象和受影响的缓存。 方法名称的快捷方式({@code root. methodName})和目标类({@code root.targetClass})也可用。 方法参数可以通过索引访问。例如,可以通过 {@code root.args[1]}、{@code p1} 或 {@code a1} 访问第二个参数。如果该信息可用,也可以按名称访问参数。

3.4、冲缓存中删除数据【删除和修改方法使用】

下面列举了三种获取key值的方法,选择哪一种都可以

/**
* CacheEvict:清理指定缓存
* value:缓存的名称,每一个缓存名称下面可以有多个key
* key:缓存的key,重点灵活配置
*/
// @CacheEvict(value = "userCache",key = "#p0")
// @CacheEvict(value = "userCache",key = "#root.args[0]")
@CacheEvict(value = "userCache",key = "#id")
@DeletMapping("/{id}")
public void get(@PathVariable Long id){
   dishService.removeById(id);
}

3.5、查看缓存数据,没有就添加

如果缓存中有数据就不执行方法直接放回,没有缓存数据就添加,同时添加了一个判断条件,当返回值不为空的时候再进行添加缓存

/*
* unless:满足条件不缓存
* condition:满足条件时才缓存
* 
*/
// @CacheEvict(value = "userCache",key = "#p0")
// @CacheEvict(value = "userCache",key = "#root.args[0]")
@Cacheable(value = "userCache",key = "#users.id",unless= "#result == bull")
@GetMapping("/{id}")
public User get(@PathVariable Long id){
   User users = userService.getById(id);
   return users;
}

4、Spring Cache缓存到Redis中

4.1、导入maven坐标

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--使用注解完成缓存技术-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

这里的操作redis是必须要有 spring-boot-starter-data-redis 依赖包的

在这里插入图片描述

4.2、在application.yml配置文件中配置Redis

spring:
  # 配置redis链接学习
  redis:
    host: localhost
    port: 6379
    database: 0 # 操作的库(有12个)
    jedis:
      pool:
        max-active: 8 # 最大链接数据
        max-wait: 1ms # 连接池最大阻塞等待时间
        max-idle: 4 # 连接线中最大的空闲链接
        min-idle: 0 # 连接池中最小空闲链接
   cache:
    redis:
      time-to-live: 1800000 # 缓存的过期时间

到此这篇关于SpringCache缓存处理详解的文章就介绍到这了,更多相关SpringCache缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 批量删除html中注释内容的方法

    Java 批量删除html中注释内容的方法

    最近项目中有一个功能需要读取外部html文本文件。但是有的html文件里面有大量的注释,需要删除其中的注释在存储
    2014-04-04
  • 在spring中实例化bean无效的问题

    在spring中实例化bean无效的问题

    这篇文章主要介绍了在spring中实例化bean无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java详细分析讲解泛型

    Java详细分析讲解泛型

    在正式进入内容之前说明一下:泛型的内容太多,也太复杂。这里因为Java中写数据结构的时候会使用到,所以加上。关于泛型我找了挺多文章,再结合自己的理解,尽可能将其讲清楚。不求会使用泛型,只要求后面数据结构出现泛型的时候能够知道是在干什么即可
    2022-05-05
  • SpringSecurity使用PasswordEncoder加密用户密码的示例代码

    SpringSecurity使用PasswordEncoder加密用户密码的示例代码

    PasswordEncoder是Spring Security库中的一个关键组件,它主要用于处理密码的安全存储和验证,本文将给大家介绍一下SpringSecurity使用PasswordEncoder加密用户密码的方法,需要的朋友可以参考下
    2024-09-09
  • springboot中使用redis由浅入深解析

    springboot中使用redis由浅入深解析

    这篇文章主要由浅入深为大家介绍了springboot中使用redis的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 使用MyBatis拦截器实现SQL的完整打印

    使用MyBatis拦截器实现SQL的完整打印

    当我们使用Mybatis结合Mybatis-plus进行开发时,为了查看执行sql的信息通常我们可以通过属性配置的方式打印出执行的sql语句,但这样的打印出了sql语句常带有占位符信息,不利于排错,所以本文介绍了构建MyBatis拦截器,实现SQL的完整打印,需要的朋友可以参考下
    2024-07-07
  • 一文带你看懂Java8中的lambda表达式和方法引用

    一文带你看懂Java8中的lambda表达式和方法引用

    Lambda 表达式是 Java 8 引入的一项重要特性,它提供了一种简洁、清晰且灵活的语法来表示可传递的匿名函数,下面就跟随小编一起学习一下Java8中的lambda表达式和方法引用的相关知识吧
    2023-12-12
  • SpringMVC中ModelAndView的使用及说明

    SpringMVC中ModelAndView的使用及说明

    这篇文章主要介绍了SpringMVC中ModelAndView的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 手把手教你如何获取微信用户openid

    手把手教你如何获取微信用户openid

    众所周知小程序的openid相当重要,它是用户的唯一标识id,牵扯的支付,登录,授权等,下面这篇文章主要给大家介绍了关于如何获取微信用户openid的相关资料,需要的朋友可以参考下
    2023-02-02
  • IDEA如何配置本地tomcat启动项目

    IDEA如何配置本地tomcat启动项目

    这篇文章主要介绍了IDEA如何配置本地tomcat启动项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论