springboot缓存——@Cacheable

概念 / 注解
作用
Cache
缓存接口,定义缓存操作。实现有: RedisCache EhCacheCache
ConcurrentMapCache
CacheManager
缓存管理器,管理各种缓存 (Cache) 组件
@Cacheable
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,以后再获取相同的数据时,直接从缓存中获取,不再 调用方法
@CacheEvict
清空缓存
@CachePut
保证方法被调用,又希望结果被缓存。
@EnableCaching
开启基于注解的缓存
keyGenerator
缓存数据时 key 生成策略
serialize
缓存数据时 value 序列化策略
说明:
@Cacheable 标注在方法上,表示该方法的结果需要被缓存起来,缓存的键由 keyGenerator 的 策略决定,缓存的值的形式则由serialize 序列化策略决定 ( 序列化还是 json 格式 ) ;标注上该注解之 后,在缓存时效内再次调用该方法时将不会调用方法本身而是直接从缓存获取结果
   
@CachePut 也标注在方法上,和 @Cacheable 相似也会将方法的返回值缓存起来,不同的是标 注@CachePut 的方法每次都会被调用,而且每次都会将结果缓存起来,适用于对象的更新
@Cacheable注解的属性
属性名
描述
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 条件将不被支持
可用的SpEL表达式见下表
名字
位置
描述
示例
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 ,需要就下载吧!

你可能感兴趣的:(spring,boot)