解决数据库和缓存数据不一致情况:延迟双删

在高并发的场景下,数据库处理数据增删改查很是薄弱。有一些数据查询的频率远大于修改频率,就需要使用缓存技术,让先去请求redis,redis存在返回缓存数据,redis不存在就查询数据库,返回数据的同时将数据缓存到redis中。

问题

读取缓存一般没有什么问题,一旦涉及到数据更新:数据库或者缓存更新,就容易出现缓存和数据库数据不一致情况。首先,数据“一致性”包含两种情况:

  1. 缓存有数据,那么缓存的值和数据库中的值相同。
  2. 缓存没有数据,那么,数据库中的值必须是最新值。

在高并发的情况下,不管是先写数据库,再删缓存;还是先删缓存,再写数据库,都有可能出现数据不一致的情况,比如:

  1. 如果删除了缓存redis,还没来得及写库mysql,另一个线程就读取,发现缓存为空,则去数据库读取数据写入缓存,此时缓存中的数据为脏数据。
  2. 如果写了库,在删除缓存前,写库的线程宕机了,也会出现数据不一致的情况。

解决办法

延迟双删策略

1、先删除缓存
2、再写数据库
3、休眠500ms(根据统计线程读取数据和写缓存的时间)
(休眠的作用是当前线程等其他线程读完了数据后写入缓存后,删除缓存)
4、再删除缓存

设置缓存过期时间

总结

先清除缓存,然后再写入数据库。有可能存在删除缓存以后,另一个线程读取数据,发现没有数据,就去数据读取数据,然后写入缓存中,此时缓存中的数据为脏数据;
解决办法:

  1. 先删除缓存
  2. 再写入数据库
  3. 休眠500ms
  4. 删除缓存
    其中第三步骤的500ms,是根据业务读取数据平均耗时,这样做的目的是确保读请求可以结束,写请求可以删除读请求造成的脏数据的问题。
posted @   小码A梦  阅读(2968)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示