四. 基于Spring Cache实现缓存
4.1 Spring Cache优点
根据上图可知,Spring Cache具有如下优点:
基于注解,代码清爽简洁;
支持各种缓存:Spring Cache并非一种具体的缓存技术,而是基于各种缓存产品(如Guava、EhCache、Redis等)进行的一层封装,结合SpringBoot开箱即用的特性用起来会非常方便;
可以实现复杂的逻辑;
可以对缓存进行回滚
4.2 Spring Cache包结构
4.3 常用注解
@Cacheable //查询
@CachePut //增改
@CacheEvict //删除
@Caching //组合多个注解
@CacheConfig //在类上添加,抽取公共配置
4.4 代码实现
4.4.1 配置类
4.4.2service层实现类
4.5 缺点
任何一种技术都不是十全十美的,Spring Cache也不例外,它也有一些缺点,比如:
不能保证数据的一致性:保存和修改数据是,是先修改数据库,然后再进行更新缓存。如果不满意延迟效果,可以不用cache ,用双删。
过期进间配置:过期时间统一配置。
五.缓存一致性问题
我们在实现Redis缓存时,其实会存在缓存一致性的问题,比如下图所示:
5.1 代码同步更新
强一致性,但代码耦合高。
5.2 代码异步更新
有延迟,借助设计模式或者mq。
5.3 缓存自己的TTL
缓存有一定的延迟,可能造成缓存击穿,或者雪崩问题。
5.4 用定时任务
要把握好更新频率。
六.分布式锁的实现
6.1 实现流程
解释说明:
缓存击穿和雪崩可以用分布式解决。
线程1,代码当前线程
线程2,代表和线程1的同类线程。
线程3,代表其它线程。
6.2 实现代码
6.2.1 核心代码
6.2.2 测试CountDownLatch
6.2.3测试结果
七. 小结
至此,小编就带大家利用Spring Cache实现了分布式缓存,我们在开发时要依据具体的业务逻辑具体地分析解决。其实在项目中并没有固定的格式,只要大家选择适合自己项目场景的方案即可。