深入了解Redis【二十】缓存和数据库双写一致性问题
引言
缓存与数据库双写一致性问题在以前自己做的Go项目《旅行记账》app的时候学习过,也整理了文档:数据库、缓存双写一致性方案
简单的介绍了一下Cache Aside Pattern
- 失效
应用程序先从cache中取数据,没有得到(数据带失效时间),则从数据库中取数据,成功后,放入缓存。 - 命中
应用程序从cache中取数据,取到数据后返回。 - 更新
先将数据更新到数据库中,成功后,再将缓存数据清除。
这个套路有个问题:在并发操作的时候,假设缓存刚刚失效。有个线程A,从库中获取到旧的值,并刷缓存;线程B更新值,并清除缓存。这种情况,肯定会出现脏读。
但是数据库的读操作比写操作快的多,即A线程大多数情况下比B线程先操作结束,即先程序写缓存在大多数情况下肯定是优先于B线程删除缓存,最终,缓存中没有数据,其他线程缓存脏读的几率很小。
还有个问题:更新操作,删除缓存那一步失败了,怎么处理,肯定不能等着下一波更新或者缓存超时,应该引入重试机制:如果缓存删除失败,将key放入队列,由专门的线程处理重试。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!