一)基于声明式注释的缓存
@Cacheable:触发缓存填充。
@CacheEvict:触发缓存删除。
@CachePut:更新缓存,而不会干扰方法的执行。
@Caching:重新组合要应用于一个方法的多个缓存操作。
@CacheConfig:在类级别共享一些与缓存相关的常见设置。
二)@Cacheable
含义:当调用该注解声明的方法时,会先从缓存中查找,判断是否有key相同缓存的数据,如果有,就直接返回数据,如果没有,执行方法,然后把返回的数据以键值的方式存储到缓存中,方便下次同样参数请求时,直接从缓存中返回数据。
@Cacheable支持如下几个参数:
cacheNames:缓存位置的一段名称,不能为空,和value一个含义。
value:缓存位置的一段名称,不能为空,和cacheNames一个含义。
key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL。
keyGenerator:指定key的生成策略。
condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL。
默认秘钥生成:
由于缓存本质上是键值存储,因此每次调用缓存方法都需要转换为适合缓存访问的键。
缓存抽象使用KeyGenerator
基于以下算法的简单方法:
1、如果没有给出参数,则返回SimpleKey.EMPTY
。
2、如果仅给出一个参数,则返回该实例。
3、如果给定多个参数,则返回SimpleKey
包含所有参数的参数。
只要参数具有自然键并实现有效hashCode()
和equals()
方法,此方法就适用于大多数用例。
使用方式:
// 可定义多个key
@Cacheable(cacheNames = {"name1", "name2"})
public User listUsers(User user) {...}
自定义秘钥生成:
当默认秘钥生成方式不满足需求时,可自定义秘钥生成方式。要提供其他默认密钥生成器,您需要实现org.springframework.cache.interceptor.KeyGenerator
接口。
使用方式: