海北营销网站建设公司,广州网站建设网站优化推广,个人建设网站如何定位,厦门网站建设满山红在现代系统中#xff0c;缓存可以极大地提升性能#xff0c;减少数据库的压力。
然而#xff0c;一旦缓存和数据库的数据不一致#xff0c;就会引发各种诡异的问题。
我们来看看几种常见的解决缓存与数据库不一致的方案#xff0c;每种方案都有各自的优缺点 先更新缓存缓存可以极大地提升性能减少数据库的压力。
然而一旦缓存和数据库的数据不一致就会引发各种诡异的问题。
我们来看看几种常见的解决缓存与数据库不一致的方案每种方案都有各自的优缺点 先更新缓存再更新数据库
这种方案看似简单实际上很少被推荐。 原因在于如果在更新数据库之前发生了错误缓存中的数据将和数据库中的数据不一致最终导致更大的问题。 先更新数据库再更新缓存
这种方法解决了更新缓存失败的问题但可能引发另外一个问题 在高并发场景下数据库已经更新但缓存还没有更新时其他请求可能会读到旧的缓存数据。 先删除缓存后更新数据库
这种方案在高并发下容易产生问题 在缓存删除和数据库更新之间的时间窗口内其他请求可能会读取到旧的数据导致短时间内的数据不一致 先更新数据库后删除缓存
这是较为推荐的一种方法但在高并发场景下也有一定的局限性 如果数据库更新成功但缓存删除失败可能导致短时间内的数据不一致。 强一致性与最终一致性
在讨论一致性的时候我们常常会提到强一致性和最终一致性。 根据业务需求权衡这两者是缓存策略设计中的重要一步。
后面我会给出一个弱一致性的推荐方案供大家参考。
SpringCache是一个非常实用的缓存管理框架能帮助我们简化缓存操作。
以下是一个简单的SpringCache配置示例 缓存预热策略
缓存预热的重要性不言而喻上线后瞬时大流量可能导致缓存击穿。
以下是几种常见的缓存预热方案 启动时加载系统启动时加载常用数据到缓存。 定时加载定时任务定期加载数据。 手动加载手动执行预热脚本。
推荐方案
综合考虑各种方案的优缺点我给大家一种工作中真正常用的方案也是我待过的互联网公司中实践过的方案。 这是一种非常简单且成本很低的操作但能解决绝大多数的缓存与数据库不一致问题。
原理很好理解就是更新数据库之后设置合理的休眠时间然后再次删除掉其他线程请求进来导致的旧缓存最终达到缓存和数据库都是最新数据的目的。
其中休眠时间要根据自身业务的平均耗时来决定而延迟双删其实就够了延迟三删只是为了开阔大家的思路因为真有些公司删除三次来保证一些极端情况的不一致但我觉得没必要太极端就不是弱一致性了。
如果是比较复杂的项目甚至能再进一步的优化也就是借用定时任务和MQ来替代休眠线程实现异步删除缓存达到弱一致性的结果。
最后说一句(求关注!别白嫖)
如果这篇文章对您有所帮助或者有所启发的话求一键三连点赞、转发、在看。
关注公众号woniuxgg在公众号中回复笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记回复面试、开发手册、有超赞的粉丝福利