前言:https://blog.csdn.net/u012882108/article/details/115050061该方案比较重,对于一般场景,可以使用本文无锁缓存方案。方案对应的代码实现(springboot starter组件)有时间了再上传。
一、设计目的
提供一种缓存解决方案,该方案不强依赖redis、不使用锁,实现缓存数据和源数据的基本(最终)一致性。
二、方案要点
- 源数据的操作使用乐观锁,使用版本号实现;
- 缓存数据的检查和更新依赖数据的版本号;
- KWO:keys for waitting operations,等待操作的key池,使用redis的SortedSet储存,其中member为key,score为时间戳;
- 缓存操作失败不影响主流程,缓存数据依靠定时任务按策略检查与源数据的一致性;
- 缓存更新时保留版本号较大的一个,如果并发导致脏数据,通过定时任务纠正;