SpringBoot使用@Cacheable注解实现缓存功能流程详解

目录
  • 一、Spring从3.1开始支持Cache
  • 二、@Cacheable常用属性
    • 1、value/cacheNames
    • 2、key
    • 3、condition
    • 4、unless
    • 5、keyGenerator
    • 6、sync
    • 7、cacheManager
  • 三、整合步骤

一、Spring从3.1开始支持Cache

Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cacheorg.springframework.cache.CacheManager接口来统一不同的缓存技术。并支持使用 JCache(JSR-107)注解简化我们的开发。

其使用方法和原理都类似于 Spring 对事务管理的支持,Spring Cache 是作用在方法上的,其核心思想是,当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存在缓存中。

SpringBoot中提供的缓存注解@Cacheable,@Cacheable会将方法的返回值作为缓存的value,默认将方法的参数值作为缓存的key。@Cacheable可以标记在某个具体的方法上,也可以标记带一个类上,表示该类的所有方法都支持缓存。

每次调用需要缓存功能的方法时,Spring 会检查指定参数的指定目标方法是否已经被调用过,如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户,下次调用直接从缓存中获取。

二、@Cacheable常用属性

  • @Cacheable添加缓存,相同条件的查询不再查询数据库,而是从缓存中查询;
  • @CachePut每次都会访问数据库,并更新缓存;
  • @CacheEvict清除缓存;

1、value/cacheNames

如上图所示,这两个属性代表的意义相同,这两个属性都是用来指定缓存组件的名称,即将方法的返回结果放在哪个缓存中,属性定义为数组,可以指定多个缓存;

2、key

可以通过 key 属性来指定缓存数据所使用的的 key,默认使用的是方法调用传过来的参数作为 key。最终缓存中存储的内容格式为:Entry<key,value> 形式。

3、condition

触发条件。这个参数是规定这个缓存触发的条件拼接,例如 condition="#area.id != 1",就是在id不为1的时候触发缓存。

4、unless

排除条件。这个参数是规定这个缓存在何时不触发,例如 unless="#result == null",不对查询结果为NULL的结果进行缓存。

5、keyGenerator

自定义的Key策略,比如缓存的Key值就是方法名。

@Configuration
public class CacheConfig{
	@Bean
	public KeyGenerator myKeyGenerator(){
		return (target,method,params)->method.getName();
	}
}

KeyGenerator 是Spring提供的一个函数式接口。

package org.springframework.cache.interceptor;
import java.lang.reflect.Method;
/**
 * Cache key generator. Used for creating a key based on the given method
 * (used as context) and its parameters.
 *
 * @author Costin Leau
 * @author Chris Beams
 * @author Phillip Webb
 * @since 3.1
 */
@FunctionalInterface
public interface KeyGenerator {
	/**
	 * Generate a key for the given method and its parameters.
	 * @param target the target instance
	 * @param method the method being called
	 * @param params the method parameters (with any var-args expanded)
	 * @return a generated key
	 */
	Object generate(Object target, Method method, Object... params);
}

通过@Cacheable(keyGenerator=“myKeyGenerator”)指定Key自定义的生成策略。

6、sync

是否使用异步模式,默认是方法执行完,以同步的方式将方法返回的结果存在缓存中。

7、cacheManager

可以用来指定缓存管理器,从哪个缓存管理器里面获取缓存。

三、整合步骤

1、加入pom

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

2、启动类加@EnableCaching注解

3、controller或service加@Cacheable注解即可 四、代码实例

package com.nezha.controller;
import com.nezha.entity.Area;
import com.nezha.service.area.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/area")
public class AreaController {
    @Autowired
    private AreaService areaService;
	// @Cacheable添加缓存,相同条件的查询不再查询数据库,而是从缓存中查询
    @Cacheable(cacheNames="area",key = "#id")
    @GetMapping("getAreaById")
    public Area getAreaById(Integer id) {
        return areaService.getAreaById(id);
    }
	// @CachePut每次都会访问数据库,并更新缓存
    @CachePut(cacheNames="area",key = "#id")
    @PostMapping("updateAreaById")
    public void updateAreaById(Integer id) {
        areaService.updateAreaById(id);
    }
	// @CacheEvict清除缓存
    @CacheEvict(cacheNames="area",key = "#id")
    @PostMapping("deleteAreaById")
    public void deleteAreaById(Integer id) {
        areaService.deleteAreaById(id);
    }
}

通过postman访问127.0.0.1:8080/NettyProject/area/getAreaById?id=1,第一次时控制台输出sql日志,第二次请求时,控制台无日志输出,证明未进行sql查询,查询的是@Cacheable(cacheNames="area",key = "#id")缓存的数据。

到此这篇关于SpringBoot使用@Cacheable注解实现缓存功能流程详解的文章就介绍到这了,更多相关SpringBoot @Cacheable内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot @Cacheable自定义KeyGenerator方式

    目录 @Cacheable自定义KeyGenerator 1. 概述 2. MySimpleKey 类 3. MyKeyGenerator 类 4. 配置keyGenerator Spring-Cache key设置 第一种方式:手动设置 第二种方式:自定义keyGenerator @Cacheable自定义KeyGenerator 1. 概述 SpringBoot 使用 @Cacheable 可以方便的管理缓存数据,在不指定 key 属性的情况下,默认使用 SimpleKeyGenerator

  • SpringBoot使用@Cacheable时设置部分缓存的过期时间方式

    目录 使用@Cacheable时设置部分缓存的过期时间 业务场景 添加Redis配置类RedisConfig.java @Cacheable自定义缓存过期时间 pom yml RedisConfig CustomRedisCacheManager 使用 使用@Cacheable时设置部分缓存的过期时间 业务场景 Spring Boot项目中有一些查询数据需要缓存到Redis中,其中有一些缓存是固定数据不会改变,那么就没必要设置过期时间.还有一些缓存需要每隔几分钟就更新一次,这时就需要设置过期时间

  • springboot增加注解缓存@Cacheable的实现

    目录 springboot增加注解缓存@Cacheable 业务层使用 配置 @Cacheable注解的属性使用 cacheNames和value key keyGenerator keyGenerator condition unless(除非) sync springboot增加注解缓存@Cacheable 业务层使用 @Cacheable(value = "dictionary#1800", key = "#root.targetClass.simpleName +':

  • 详解SpringBoot2.0的@Cacheable(Redis)缓存失效时间解决方案

    问题   @Cacheable注解不支持配置过期时间,所有需要通过配置CacheManneg来配置默认的过期时间和针对每个类或者是方法进行缓存失效时间配置. 解决   可以采用如下的配置信息来解决的设置失效时间问题 配置信息 @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { return new RedisCacheManager( RedisCacheWriter.no

  • SpringBoot整合Redis使用@Cacheable和RedisTemplate

    对之前网站做了一些很简单的优化,给用户列表加了一个分页功能. 分页就更好考虑加载速度,如果换一页就要等几秒,那体验感是非常差的. 因此想到了加一个redis缓存. springboot整合redis有两种方式: 一.使用注解,@EnableCaching @Cacheable . . . 等 二.使用RedisTemplate 两者都能操作缓存,使用RedisTemplate 操作肯定是比使用注解灵活.方便.但是从理论上来讲注解方式速度应该更快,因为使用注解如果在缓存中有就直接从缓存中取,不用进

  • SpringBoot如何使用@Cacheable进行缓存与取值

    目录 使用@Cacheable进行缓存与取值 1. @Cacheable的作用 2.常用属性说明 SpringBoot中Cacheable使用说明 功能说明 1. cacheNames & value 2. 关联多个缓存名 3. key & keyGenerator 4. cacheManager & cacheResolver 5. sync 6. condition 7. unless 8. condition VS unless ? 使用@Cacheable进行缓存与取值 1

  • SpringBoot实现服务接入nacos注册中心流程详解

    目录 概述 接入nacos注册中心 springboot服务pom文件 application.properties配置 源码分析 小结 源码流程图 概述 某些场景下只需要把springboot微服务化而不想引入springcloud如何实现的呢? 下面我们介绍nacos注册中心方案. 接入nacos注册中心 springboot服务pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h

  • C++调用libcurl开源库实现邮件的发送功能流程详解

    目录 1.为啥要选择libcurl库去实现邮件的发送 2.调用libcurl库的API接口实现邮件发送 3.构造待发送的邮件内容 4.开通163发送邮件账号的SMTP服务 5.排查接收的邮件内容为空的问题 libcurl中封装了支持这些协议的网络通信模块,支持跨平台,支持Windows,Unix,Linux等多个操作系统.libcurl提供了一套统一样式的API接口,我们不用关注各种协议下网络通信的实现细节,只需要调用这些API就能轻松地实现基于这些协议的数据通信.本文将简单地讲述一下使用lib

  • SpringBoot文件上传与下载功能实现详解

    目录 前言 1.引入Apache Commons FileUpload组件依赖 2.设置上传文件大小限制 3.创建选择文件视图页面 4.创建控制器 5.创建文件下载视图页面 前言 文件上传与下载是Web应用开发中常用的功能之一,在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设置为multipart/form-data 只有这样设置,浏览器才能将所选文件的二进制数据发送给服务器 从Servlet3.0开始,就提供了处理文件上传的方法,但这种文

  • Spring @Cacheable注解中key的使用详解

    目录 Spring @Cacheable注解中key使用 下面是几个使用参数作为key的示例 condition属性指定发生的条件 @CachePut @CacheEvict allEntries属性 beforeInvocation属性 @Caching 使用自定义注解 @Cacheable 拼接key Spring @Cacheable注解中key使用 key属性是用来指定Spring缓存方法的返回结果时对应的key的.该属性支持SpringEL表达式.当我们没有指定该属性时,Spring将

  • 通过源代码分析Mybatis的功能流程详解

    SQL解析 Mybatis在初始化的时候,会读取xml中的SQL,解析后会生成SqlSource对象,SqlSource对象分为两种. DynamicSqlSource,动态SQL,获取SQL(getBoundSQL方法中)的时候生成参数化SQL. RawSqlSource,原始SQL,创建对象时直接生成参数化SQL. 因为RawSqlSource不会重复去生成参数化SQL,调用的时候直接传入参数并执行,而DynamicSqlSource则是每次执行的时候参数化SQL,所以RawSqlSourc

  • Springboot框架整合添加redis缓存功能

    目录 一:安装Redis 二:添加Redis依赖 三:添加Redis配置信息 四:创建RedisConfigurer 五:创建Redis常用方法 六:接口测试 Hello大家好,本章我们添加redis缓存功能 .另求各路大神指点,感谢 一:安装Redis 因本人电脑是windows系统,从https://github.com/ServiceStack/redis-windows下载了兼容windows系统的redis 下载后直接解压到自定义目录,运行cmd命令,进入到这个文件夹,在这个文件夹下运

  • SpringBoot使用Shiro实现动态加载权限详解流程

    目录 一.序章 二.SpringBoot集成Shiro 1.引入相关maven依赖 2.自定义Realm 3.Shiro配置类 三.shiro动态加载权限处理方法 四.shiro中自定义角色与权限过滤器 1.自定义uri权限过滤器 zqPerms 2.自定义角色权限过滤器 zqRoles 3.自定义token过滤器 五.项目中会用到的一些工具类常量等 1.Shiro工具类 2.Redis常量类 3.Spring上下文工具类 六.案例demo源码 一.序章 基本环境 spring-boot 2.1

  • Springboot实现动态定时任务流程详解

    目录 一.静态 二.动态 1.基本代码 2.方案详解 2.1 初始化 2.2 单次执行 2.3 停止任务 2.4 启用任务 三.小结 一.静态 静态的定时任务可以直接使用注解@Scheduled,并在启动类上配置@EnableScheduling即可 @PostMapping("/list/test1") @Async @Scheduled(cron = "0 * * * * ?") public void test1() throws Exception { Ob

  • SpringBoot响应处理实现流程详解

    目录 1.相关依赖 2.ReturnValueHandlers—返回值处理器 3.HttpMessageConvert—消息转换器 4.开启浏览器参数方式内容协商功能 1.相关依赖 web项目引入的启动器spring-boot-starter-web中含有 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</arti

  • SpringBoot自定义路由覆盖实现流程详解

    目录 背景 设计 实现 注解定义 注解扫描及管理 自定义RequestMappingHandlerMapping 注册RequestMappingHandlerMapping 使用示例 背景 公司最近有一个项目二期需要对一些功能进行改造,涉及部分框架内置业务接口个性化定制,兼容老接口功能并且增加一部分新的数据返回,由于前端调用这些接口分布较多且较为零碎,修改测试成本较大,所以打算在框架层面提供路由覆盖功能,加快项目进度减少无技术含量的修改带来的系统风险 设计 提供自定义注解指定需要覆盖的路由及新

随机推荐