SpringBoot-缓存

SpringBoot缓存

Spring从3.1开始定义了org.springframework.cache.Cache
org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用Java Caching(JSR-107)注解简化我们进行缓存开发。Spring Cache 只负责维护抽象层,具体的实现由你的技术选型来决定。将缓存处理和缓存技术解除耦合。

JSR107核心接口

Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry和 Expiry。

  • CachingProvider:创建、配置、获取、管理和控制多个CacheManager

  • CacheManager:创建、配置、获取、管理和控制多个唯一命名的Cache,Cache存在于CacheManager的上下文中。一个CacheManager仅对应一个CachingProvider

  • Cache:是由CacheManager管理的,CacheManager管理Cache的生命周期,Cache存在于CacheManager的上下文中,是一个类似map的数据结构,并临时存储以key为索引的值。一个Cache仅被一个CacheManager所拥有

  • Entry:是一个存储在Cache中的key-value对

  • Expiry:每一个存储在Cache中的条目都有一个定义的有效期。一旦超过这个时间,条目就自动过期,过期后,条目将不可以访问、更新和删除操作。缓存有效期可以通过ExpiryPolicy设置

SpringBoot缓存注解

@Cacheable:针对方法配置,能够根据方法的请求参数对其结果进行缓存

@CacheEvict:清空缓存

@CachePut:既调用方法,又更新缓存数据

@EnableCaching:开启基于注解的缓存

@Caching:定义复杂的缓存规则

@CacheConfig:使用在类上,用于将缓存的共同配置提取出来

SpringBoot缓存的使用方法

1、:导入缓存依赖启动器

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

2、主启动类上添加启动缓存的注解

@EnableCaching

3、在需要缓存的类或方法上添加缓存注解即可

@Cacheable

@Cacheable:针对方法配置,能够根据方法的请求参数对其结果进行缓存。先查看是否有缓存结果,没有才执行方法

可选参数

cacheNames/value:指定缓存组件的名字,数组形式。

key:缓存数据使用的key,确定缓存可以用唯一key进行指定;eg:编写SpEL; #id,参数id的值 ,,#a0(第一个参数), #p0(和a0的一样的意义) ,#root.args[0]

keyGenerator:key的生成器;可以自己指定key的生成器的组件id(注意: key/keyGenerator:二选一使用;不能同时使用)

cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器

condition:指定符合条件的情况下才缓存;使用SpEl表达式,eg:condition = "#a0>1":第一个参数的值>1的时候才进行缓存

unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;eg:unless = "#a0!=2":如果第一个参数的值不是2,结果不缓存;

sync:是否使用异步模式

自定义key的生成策略:给容器注入一个KeyGenerator 即可,使用时keyGenerator="keyGenerator(注入的组件名)"

package com.wyx.config;

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.lang.reflect.Method;
import java.util.Arrays;

@Configuration
public class CacheConfig {

    @Bean
    public KeyGenerator keyGenerator(){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                /* 主键生成策略 
                 target 目标对象
                 method 方法
                 params 参数
                 */
                return method.getName()+"["+ Arrays.asList(params).toString()+"]";
            }
        };
    }
}

@CachePut

@CachePut:既调用方法,又更新缓存数据,先执行方法,再更新缓存

可选参数和 @Cacheable 差不多,具体查看上面即可,

因为该方法是执行完方法才更新缓存,于是可以使用result 获取返回值的属性 key = "#result.参数"

@CacheEvict

@CacheEvict:清空缓存。

可选参数

key:指定要清除的数据

allEntries = true:指定清除这个缓存中所有的数据

beforeInvocation = false:默认代表缓存清除操作是在方法执行之后执行

beforeInvocation = true:代表清除缓存操作是在方法运行之前执行

@Caching

@Caching:定义复杂的缓存规则

用于定义复杂的缓存规则,它是@Cacheable@CachePut@CacheEvict的组合注解,使用示例如下

@Caching(
    // 
    cacheable = {
        @Cacheable(/*value={"emp"},*/key = "#lastName"),
        @Cacheable(规则)
    },
    put = {
        @CachePut(/*value={"emp"},*/key = "#result.id"),
        @CachePut(规则)
    },
    evict = {
        @CacheEvict(规则),
        @CacheEvict(规则)
    }
)
public Employee getEmpByLastName(String lastName){
    return employeeMapper.getEmpByLastName(lastName);
}

@CacheConfig

@CacheConfig:使用在类上,用于将缓存的共同配置提取出来

可选参数

cacheNames :指定缓存组件的名字,数组形式。

keyGenerator:key的生成器;可以自己指定key的生成器的组件id(注意: key/keyGenerator:二选一使用;不能同时使用)

cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器

cacheResolver 指定缓存解析器

Cache-SpEL

名称 位置 描述 示例
methodName root对象 当前被调用的方法名 #root.methodname
method root对象 当前被调用的方法 #root.method.name
target root对象 当前被调用的目标对象实例 #root.target
targetClass root对象 当前被调用的目标对象的类 #root.targetClass
args root对象 当前被调用的方法的参数列表 #root.args[0]
caches root对象 当前方法调用使用的缓存列表 #root.caches[0].name
argument Name 执行上下文(avaluation context) 当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数 #artsian.id
result 执行上下文(evaluation context) 方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false) #result
posted @ 2021-05-30 20:58  橘子有点甜  阅读(179)  评论(0编辑  收藏  举报