【工作技术栈】通用的旁路缓存一致性缺陷以及解决方式
目录
- 前言
- 现象
- 分析原因
- 解决方法
- 思考感悟
前言
如果你使用的缓存一致性不是“旁路缓存","写后删"的话,那么这篇文章可能就让您失望了,但是篇幅不长可以参考一下
现象
大多数缓存一致性解决方案都使用了旁路缓存,之前的工作在这方面的方案并没有特别大的出入,直到最近看到旁路缓存带来的一些问题时才饶有兴趣的看了看解决方案
首先看下旁路缓存的玩法:
分析原因
之前线上没出现过什么特别大的问题,也就没有想过这个方案可能会存在什么问题,后来有一次出现修改没有生效,但是重新登录后才生效的场景,这个时候才有心去分析一下,结果大致如下:
解决方法
核心原因:读取的时候回写过程由于缓存被删除,无法判断自己写的这个版本是否是新的还是老的
一句话解决方案:增加版本机制
具体解决策略如下:
思考感悟
几个优化点:
1、首先存储cache数据需要一个通用的数据结构来封装对于后续的拓展非常有帮助,每一个值即使是空值也可以用通用数据结构占位,这样既可以解决缓存一致性问题,还能够解决缓存穿透的问题
存在的问题:
1、以前删除的数据就不再占用空间,现在不存在的数据还会占用一定的数据结构空间,对缓存的存储压力会增加
2、版本机制的version复杂度也增加了,需要缓存底层并发支持版本号机制的判断,如果在业务代码中写通用的版本比对会仍然会造成业务代码获取的版本为老版本导致判断出错从而写入老数据的问题,所以该机制一定需要缓存底层支持,否则就需要加细粒度锁来支持。