Spring Cache
使用步骤
1.导入坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.开启基于注解的缓存,使用 @EnableCaching 标注在 springboot 主启动类上。
3.标注缓存注解 @Cacheable
使用 @Cacheable 注解Spring会在其被调用后将其返回值缓存起来,以后查询相同的数据,直接从缓存中取,不需要调用方法。
标记在类上:该类所有方法支持缓存。
标记在方法上:该方法支持缓存。
当一个支持缓存的方法在对象内部被调用时不会触发缓存功能。
注解属性说明
@Cacheable
- cacheNames/value :用来指定缓存组件的名字
- key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来自定义【使用方法参数时直接使用 '#参数名 ‘, ’ #p 参数index’ 】)
- keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用
- cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。
- condition :可以用来指定符合条件的情况下才缓存
- unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过 #result 获取方法结果)
- sync :是否使用异步模式。
默认key生成策略
- 如有方法没有参数,则使用 0 作为key。
- 如果只有一个参数的话则使用该参数作为key。
- 如果参数多于一个的话则使用所有参数的hashCode作为key。
@CachePut
@CachePut注解属性与@Cacheable注解属性相比少了sync属性。其他用法基本相同.
如果一个方法使用了@Cacheable注解,当重复(n>1)调用该方法时,由于缓存机制,并未再次执行方法体,其结果直接从缓存中找到并返回,即获取还的是第一次方法执行后放进缓存中的结果。但实际业务并不总是如此,有些情况下要求方法一定会被调用,例如数据库数据的更新,系统日志的记录,确保缓存对象属性的实时性等等。
@CachePut 注解就确保方法调用即执行,执行后更新缓存。
@CacheEvict
用来标注在需要清除缓存元素的方法或类上。
- value :用来指定缓存组件的名字。
- key :缓存数据时使用的 key,可以用它来指定。
- condition :可以用来指定符合条件的情况下才清除缓存。
- allEntries:boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
- beforeInvocation:清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。
@Caching
@Caching是一个组注解,可以为一个方法定义提供基于@Cacheable、@CacheEvict或者@CachePut注解的数组。
- cacheable:取值为基于@Cacheable注解的数组,定义对方法返回结果进行缓存的多个缓存。
- put:取值为基于@CachePut注解的数组,定义执行方法后,对返回方的方法结果进行更新的多个缓存。
- evict:取值为基于@CacheEvict注解的数组。定义多个移除缓存。
@CacheConfig
前面我们所介绍的注解都是基于方法的,如果在同一个类中需要缓存的方法注解属性都相似,则需要重复增加。Spring 4.0之后增加了@CacheConfig类级别的注解来解决这个问题。
- cacheNames/value:指定类级别缓存的名字,缓存使用CacheManager管理多个缓存Cache,这些Cache就是根据该属性进行区分。对缓存的真正增删改查操作在Cache中定义,每个缓存Cache都有自己唯一的名字。
- keyGenerator:类级别缓存的生成策略(键生成器)和key二选一,作用是生成键值key,keyGenerator可自定义。
- cacheManager:指定类级别缓存管理器(例如ConcurrentHashMap、Redis等)。
- cacheResolver:和cacheManager作用一样,使用时二选一。
package com.example.cache.springcache;
import com.example.cache.springcache.entity.User;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
/**
在@CacheConfig注解中定义了类级别的缓存users和自定义键生成器,
那么在findA0和findB(方法中不再需要重复指定,而是默认使用类级别的定义。
**/
@CacheConfig(cacheNames = "users",keyGenerator = "myKeyGenerator")
public class UserService4 {
@Cacheable
public User findA(User user){
//todo:执行一些操作
}
@CachePut
public User findB(User user){
//todo:执行一些操作
}
}