Spring boot缓存

本文深入探讨Spring Cache的工作原理,包括Cacheable、CachePut和CacheEvict注解的使用,以及CacheManager和ConcurrentMapCacheManager的角色。通过实例演示如何在实际应用中配置和利用缓存提高效率。

Cache的自动配置类:

缓存的原理及运行流程:

将方法的运行结果进行缓存,以后再要相同的数据直接从缓存中获取,不用调用方法
* CacheManager管理多个缓存组件的,对缓存的真正CRUD操作在cache组件中,每个组件都有自己唯一一个名字
* 几个属性:
*  cacheNames/value:指定缓存的名字
*  key:缓存数据时使用的key,可以用它来指定,默认使用方法参数的值 例如:1-方法的返回值
*      编写SpEl:#id 参数ID的值 #a0 #p0 #root.args[0]
*  keyGenerator:key
的生成器,可以自己制定key的生成器组件id
*  key/keyGenerator
二选一
*  CacheManager:指定缓存管理器;或者cacheResolver指定缓存解析器  二者选其一
*  condition:指定符合条件的情况下才缓存
*  unless:否定缓存,unless指定的条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断  ,unless="#result==null"
*  sync
:是否使用异步模式
原理:
*      1.自动配置类;CacheAutoConfiguration
*      2.
缓存的配置类:org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
*      3.
哪个配置类默认生效:SimpleCacheConfiguration
*      4.
给容器中注册了一个CacheManager:ConcurrentMapCacheManager
*      5.
可以获取和创建ConcurrentMapCache类型的缓存组件,他的作用是将数据保存在ConcurrentMap
*
*     
运行的流程:
*      @Cacheable
*      1.
方法运行之前,先去查询Cache(缓存组件)。按照cacheNames指定的名字获取:
*          CacheManager先获取相应的内存,第一次获取缓存如果没有cache组件会自动创建
*      2.cache中查找获取缓存的内容,使用一个key(默认就是方法的参数),
*          key
是按照某种策略生成的,默认是使用keyGenerator生成,默认使用SimpleKeyGenerator生成
*              SimpleKeyGenerator生成策略:
*              如果没有参数:key=new SimpleKey();
*             
如果有一个参数:key=参数的值
*              如果有多个参数:key=new SimpleKey(params)
*      3.
没有查到缓存就调用目标方法
*      4将目标方法返回的结果放进缓存中
*
*      @Cacheable
标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,
*      如果没有就运行方法并将结果放入到缓存中,以后再来调用就可以直接使用缓存中的数据
*
*     
核心:
*      1.使用CacheManagerConcurrentMapCacheManager),按照名字得到CacheConcurrentMapCache)组件
*      2.key使用keyGenerator生成,默认是SimpleKeyGenerator

注:如果使用异步sync属性,unless属性是不支持的

/*

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

    修改了数据库的数据同时要更新一下缓存

    运行时机:

    1.先调用目标方法

    2.将目标结果的方法缓存起来

    测试步骤:

       1.查询一号员工,查出结果放在缓存中

            key:1 value:张三

       2.以后查询还是之前的结果

       3.更新一号员工

            将方法的返回值也放进缓存

            key:employee value:返回的 employee对象

       4.查询一号员工?应该是更新后的员工

            key = "#employee.id":使用传入的参数的员工的Id

            key="#result.id" :使用返回后的id

            @Cacheablekeykey是不能用#result.id的

            为什么是没更新前的数据:【1号员工没有在缓存中更新】

 */

@CachePut(value = "emp",key = "#employee.id")

public Employee updateEmp(Employee employee){

    System.out.println("updateEmp"+employee);

    employeeMapper.updateEmp(employee);

    return employee;

}

@CacheConfig()是抽取缓存的公共配置

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值