概念
/
注解
|
作用
|
Cache
|
缓存接口,定义缓存操作。实现有:
RedisCache
、
EhCacheCache
、
ConcurrentMapCache
等
|
CacheManager
|
缓存管理器,管理各种缓存
(Cache)
组件
|
@Cacheable
|
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,以后再获取相同的数据时,直接从缓存中获取,不再 调用方法
|
@CacheEvict
|
清空缓存
|
@CachePut
|
保证方法被调用,又希望结果被缓存。
|
@EnableCaching
|
开启基于注解的缓存
|
keyGenerator
|
缓存数据时
key
生成策略
|
serialize
|
缓存数据时
value
序列化策略
|
说明:
①
@Cacheable
标注在方法上,表示该方法的结果需要被缓存起来,缓存的键由
keyGenerator
的 策略决定,缓存的值的形式则由serialize
序列化策略决定
(
序列化还是
json
格式
)
;标注上该注解之 后,在缓存时效内再次调用该方法时将不会调用方法本身而是直接从缓存获取结果
②
@CachePut
也标注在方法上,和
@Cacheable
相似也会将方法的返回值缓存起来,不同的是标 注@CachePut
的方法每次都会被调用,而且每次都会将结果缓存起来,适用于对象的更新
属性名
|
描述
|
cacheNames/value
|
指定缓存的名字,缓存使用
CacheManager
管理多个缓存组件 Cache,这些
Cache
组件就是根据这个名字进行区分的。对缓存的真 正CRUD
操作在
Cache
中定义,每个缓存组件
Cache
都有自己唯一的 名字,通过cacheNames
或者
value
属性指定,相当于是将缓存的键 值对进行分组,缓存的名字是一个数组,也就是说可以将一个缓存 键值对分到多个组里面
|
key
|
缓存数据时的
key
的值,默认是使用方法参数的值,可以使用
SpEL
表 达式计算key
的值
|
keyGenerator
|
缓存的生成策略,和
key
二选一,都是生成键的,
keyGenerator
可自 定义
|
cacheManager
|
指定缓存管理器
(
如
ConcurrentHashMap
、
Redis
等
)
|
cacheResolver
|
和
cacheManager
功能一样,和
cacheManager
二选一
|
condition
|
指定缓存的条件
(
满足什么条件时才缓存
)
,可用
SpEL
表达式
(
如 #id>0,表示当入参
id
大于
0
时才缓存
)
|
unless
|
否定缓存,即满足
unless
指定的条件时,方法的结果不进行缓存, 使用unless
时可以在调用的方法获取到结果之后再进行判断
(
如 #result==null,表示如果结果为
null
时不缓存
)
|
sync
|
是否使用异步模式进行缓存
|
注:
①既满足
condition
又满足
unless
条件的也不进行缓存
②使用异步模式进行缓存时
(sync=true)
:
unless
条件将不被支持
名字
|
位置
|
描述
|
示例
|
methodName
|
root
object
|
当前被调用的方法名
|
#root.methodName
|
method
|
root
object
|
当前被调用的方法
|
#
root.method.name
|
target
|
root
object
|
当前被调用的目标对象
|
#root.target
|
targetClass
|
root
object
|
当前被调用的目标对象类
|
root.targetClass
|
args
|
root
object
|
当前被调用的方法的参数列表
|
#root.args[0]
|
caches
|
root
object
|
当前方法调用使用的缓存列表 (如
@Cacheable(value= {“cache1”, “cache2”})),则有两 个cache
|
#root.caches[0].name
|
argumentname
|
evaluation
context
|
方法参数的名字,可以直接
# 参数名,也可以使用#p0
或
#a0
的形式,
0
代表参数的索引
|
#iban
、
#a0
、
#p0
|
result
|
evaluation
context
|
方法执行后的返回值
(
仅当方法 执行之后的判断有效,
如
"unless"
,
"cache put"
的表 达式,"cache evict"
的表达式
beforeInvocation=false)
|
#result
|
@Service
@CacheConfig(cacheNames = {"#emp"})
public class EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
@Cacheable(key="#id",condition="#id>0",unless="#result==null")
public Employee getEmpById(Integer id){
Employee emp = employeeMapper.getEmpById(id);
return emp;
}
@CachePut(key = "#employee.id")
public Employee updateEmp(Employee employee){
employeeMapper.updateEmp(employee);
return employee;
}
@CacheEvict(key = "#id",beforeInvocation = true)
public void delEmp(Integer id){
employeeMapper.deleteEmpById(id);
}
}
dao层相关代码
public interface EmployeeMapper {
@Select("SELECT * FROM employee WHERE id = #{id}")
public Employee getEmpById(Integer id);
@Insert("INSERT INTO employee(lastName,email,gender,d_id) VALUES(# {lastName},#{email},#{gender},#{dId})")
public void insertEmp(Employee employee);
@Update("UPDATE employee SET lastName = #{lastName},email = #{email},gender = #{gender},d_id = #{dId} WHERE id = #{id}")
public void updateEmp(Employee employee);
@Delete("DELETE FROM employee WHERE id = #{id}")
public void deleteEmpById(Integer id);
}
如果想知道在调用controller层的时候有没有调用,可以将日志的level设置成debug等级,看打印的日志中是否包含上面mapper中的语句,第一次执行肯定调用了,第二次及后面调用的时候就没有执行了
下面是完整的springboot-cache的项目,数据库自己去创建:
spring-boot-cache.rar ,需要就下载吧!