SpringCache
@CacheEvict:失效模式
@CachePut:双写模式,需要有返回值
1、同时进行多种缓存操作:@Caching
2、指定删除某个分区下的所有数据 @CacheEvict(value = "category",allEntries = true)
3、存储同一类型的数据,都可以指定为同一分区
每一个需要缓存的数据我们都来指定要放到那个名字的缓存。【缓存的分区(按照业务类型分)】
代表当前方法的结果需要缓存,如果缓存中有,方法都不用调用,如果缓存中没有,会调用方法。最后将方法的结果放入缓存
默认行为
如果缓存中有,方法不再调用
缓存的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负责缓存的读写