🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽http://suzee.blog.csdn.net 本期我们重点讲一个后端的必考面试题 也是开发中常遇到的问题--数据一致性问题上一期我们讲到了 SpringBoot如何结合Redis做一个缓存 实现我们减少对数据库压力的一个目的。还不知道怎么做的小伙伴可以先回顾一下前文http://t.csdnimg.cn/tshRD下面正文目录 本期我们重点讲一个后端的必考面试题 也是开发中常遇到的问题--数据一致性问题 上一期我们讲到了 SpringBoot如何结合Redis做一个缓存 实现我们减少对数据库压力的一个目的。还不知道怎么做的小伙伴可以先回顾一下前文http://t.csdnimg.cn/tshRD 就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。如将商品库存缓存在Redis,若价格不对,则下单时就可能出错,这是难以接受的。 先删缓存 再更数据库 查缓存未命中则查询数据库 写入缓存 如下 该策略可能导致数据不一致的问题。例如,线程1更新数据前先删除缓存,这时候线程2查询该缓存,发现不存在,则去DB中获取,得到旧值放入缓存,然后线程1更新数据库。这时候就出现了缓存与数据库不一致的问题。 只要使用Redis缓存就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。如将商品库存缓存在Redis,若价格不对,则下单时就可能出错,这是难以接受的。什么是缓存和DB的数据一致性?
不符合这两种情况的,都属于缓存和DB数据不一致。 所以 这里我们先讨论更新的策略 一共是这么几种情况先删缓存 再更数据库 查缓存未命中则查询数据库 写入缓存 如下该策略可能导致数据不一致的问题。例如,线程1更新数据前先删除缓存,这时候线程2查询该缓存,发现不存在,则去DB中获取,得到旧值放入缓存,然后线程1更新数据库。这时候就出现了缓存与数据库不一致的问题。如图就导致了数据不一致 缓存是10 数据库却是20所以就有另一种解决方案 先更新数据库 再删缓存线程1更新了数据库,线程2也更新数据库,这时候由于某种原因,线程2首先更新了缓存,线程1后续更新。 这样就会导致了缓存脏数据的问题,因为目前数据库中存储的是线程2更新后的数据,而缓存存储的是线程1更新的旧数据。如何解决?延时双删1、何为延时双删延迟双删(Delay Double Delete)是一种在数据更新或删除时为了保证数据一致性而采取的策略。这种策略通常用于解决数据在缓存和数据库中不一致的问题。 它的实现思路是在删除缓存之后,让当前线程休眠一段时间,然后再次删除缓存。这个时间段是为了给数据库操作足够的时间来完成,确保数据已经持久化到数据库中。通过延迟双删,可以防止在休眠期间有其他线程读取到旧的缓存数据,从而保证数据的一致性。
需要注意的点上述中(延迟N秒)的时间要大于一次写操作的时间。原因:如果延迟时间小于写入redis的时间,会导致请求1清除了缓存,但是请求2缓存还未写入的尴尬。。。 延迟的时间如何确定?在业务程序运行时,统计业务逻辑执行读数据和写缓存的操作时间,以此为基础来进行估算。因为这个方案会在第一次删除缓存值后,延迟一段时间再次进行删除,所以称为“延迟双删”。 总结把几种方案进行总结会得到这样的结论
根据具体的应用场景和需求,可以选择合适的缓存策略或结合多种策略来提高系统性能和数据一致性。
|
原文地址:https://blog.csdn.net/m0_72803988/article/details/136921423
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://www.msipo.com/article-653300.html 如若内容造成侵权/违法违规/事实不符,请联系MSIPO邮箱:3448751423@qq.com进行投诉反馈,一经查实,立即删除!
Copyright © 2024, msipo.com