spring-cache的不足:
一、读模式
缓存概念:
- 缓存穿透:查询一个null数据
- 缓存击穿:大量并发同时查询一个正好过期的数据
- 缓存雪崩:缓存的大量的key过期时间相同,某一刻缓存同时失效,请求全部转发到数据库,会导致数据库压力过大而雪崩(一般大型项目才会出现)
避免缓存的方法:
- 缓存穿透:
缓存空数据;先在pom.xml文件引入redis依赖后
在application.properties资源文件中加入
#是否缓存空值.防止缓存穿透
spring.cache.redis.cache-null-values=true
- 缓存击穿:
加锁,防止高并发,限制同一时间只能有一个服务获取锁,访问数据库
在实现类上加注解(此处加的是本地锁)
@Cacheable(value = {"category"},key = "#root.method.name",sync = true)
- 缓存雪崩:
加随机时间或者加不同的过期时间,防止key同时过期
在application.properties资源文件中加入
#缓存过期时间 单位为毫秒
spring.cache.redis.time-to-live=3600000
二、写模式(缓存与数据一致)
- 读写加锁
- 引入canal。感知到MySQL的更新去更新数据库
- 读多写多,直接查询数据库
总结:
常规数据(读多写少,即时性和一致性要求不高的数据):完全可以使用spring-cache(只要缓存的数据有过期时间即可);
特殊数据:特殊设计