SpringCache

@CacheEvict:失效模式
@CachePut:双写模式,需要有返回值

1、同时进行多种缓存操作:@Caching

2、指定删除某个分区下的所有数据 @CacheEvict(value = "category",allEntries = true)

3、存储同一类型的数据,都可以指定为同一分区

每一个需要缓存的数据我们都来指定要放到那个名字的缓存。【缓存的分区(按照业务类型分)】

代表当前方法的结果需要缓存,如果缓存中有,方法都不用调用,如果缓存中没有,会调用方法。最后将方法的结果放入缓存

默认行为

如果缓存中有,方法不再调用

key是默认生成的:缓存的名字::SimpleKey::

缓存的value值,默认使用jdk序列化机制,将序列化的数据存到redis中

默认时间是 -1:

自定义操作:key的生成

指定生成缓存的key:key属性指定,接收一个Spel

指定缓存的数据的存活时间:配置文档中修改存活时间

将数据保存为json格式

4、Spring-Cache的不足之处:

1)、读模式

缓存穿透:查询一个null数据。解决方案:缓存空数据

缓存击穿:大量并发进来同时查询一个正好过期的数据。解决方案:加锁 ? 默认是无加锁的;使用sync = true来解决击穿问题

缓存雪崩:大量的key同时过期。解决:加随机时间。加上过期时间

2)、写模式:(缓存与数据库一致)

1)、读写加锁。

2)、引入Canal,感知到MySQL的更新去更新Redis

3)、读多写多,直接去数据库查询就行

总结:

常规数据(读多写少,即时性,一致性要求不高的数据,完全可以使用Spring-Cache):写模式(只要缓存的数据有过期时间就足够了)

特殊数据:特殊设计

原理:

CacheAutoConfiguration -> RedisCacheConfiguration -> 自动配置了CacheManager(RedisCacheManager) -> 初始化所有的缓存(每个缓存决定使用什么配置,如果RedisCacheConfiguration有就用已有的,没有就用默认配置,若想更改缓存的配置,只需给容器中放一个RedisCacheConfiguration即可)-> Cache(RedisCache)->Cache负责缓存的读写

posted @ 2022-01-04 13:40  阿伦啊  阅读(151)  评论(0)    收藏  举报