当前位置: 首页 > news >正文

完整教程:【面试题】缓存先删后写如何避免窗口期的旧数据写入缓存

缓存先删后写如何避免窗口期的旧数据写入缓存

方案1:分布式锁控制读写顺序

通过分布式锁(如Redis的SET NX、ZooKeeper等),在更新操作的“删缓存-更数据库”窗口期内,阻塞读请求对缓存的写入,确保数据库更新完成后再允许读请求加载新数据。

流程:
  1. 更新操作

    • 对目标缓存键(如user:100)加写锁(互斥锁,同一时间只有一个更新操作能执行)。
    • 删除缓存(DEL user:100)。
    • 更新数据库(UPDATE user SET ... WHERE id=100)。
    • 释放写锁。
  2. 读请求

    • 检测缓存是否存在:若存在,直接返回;若不存在,尝试获取读锁(与写锁互斥,即写锁未释放时,读锁获取失败)。
    • 若读锁获取失败(说明有更新操作在执行),则等待一段时间(如100ms)后重试,直到缓存存在或读锁获取成功。
    • 若读锁获取成功,从数据库读取数据(此时数据库已更新),写入缓存,最后释放读锁。
优点:
缺点:
  • 分布式锁会增加系统复杂度(需处理锁超时、释放失败等问题)。
  • 可能降低并发性能(读请求需等待写锁释放)。

方案2:延迟双删(Delete Twice)

在“先删后写”的基础上,增加一次延迟删除缓存的操作,清除窗口期可能被写入的旧数据。

流程:
  1. 第一次删除缓存(DEL user:100)。
  2. 更新数据库(UPDATE user SET ... WHERE id=100)。
  3. 延迟一段时间(如500ms,根据业务接口耗时设置)后,第二次删除缓存(DEL user:100)。
原理:
优点:
  • 实现便捷,无需锁机制,对性能影响小。
  • 适用于并发量不极高、对短暂不一致可容忍的场景(如用户信息、商品描述)。
缺点:

方案3:读写锁隔离(Read-Write Lock)

通过读写锁区分“更新操作”和“读请求”的权限,确保写操控执行时,读请求只能等待或读取数据库新数据。

流程:
具体操作:
  1. 更新操作:

    • 获取写锁 → 删除缓存 → 更新数据库 → 释放写锁。
  2. 读请求:

    • 缓存存在 → 直接返回;
    • 缓存不存在 → 尝试获取读锁:
      • 若写锁未释放(获取读锁失败),直接读数据库(此时数据库可能已更新)并返回(不写入缓存,避免旧资料);
      • 若写锁已释放(获取读锁成功),读数据库(新数据)→ 写入缓存 → 释放读锁 → 返回。
优点:
缺点:
  • 搭建较复杂(需设计读写锁的优先级和释放逻辑)。

方案4:版本号机制(Version Control)

给数据库和缓存的数据添加版本号,借助版本号校验避免旧数据覆盖新缓存。

流程:
  1. 数据库表中增加version字段(每次更新+1),缓存中存储(value, version)
  2. 更新操作
    • 删除缓存 → 更新数据库(version+1)。
  3. 读请求
    • 缓存不存在 → 读数据库(获取valuenew_version);
    • 尝试写入缓存时,若缓存此时已被其他请求写入(带有old_version),则比较版本号:
      • new_version > old_version:覆盖缓存(写入新数据+新版本);
      • new_version <= old_version:不写入(避免旧数据覆盖新缓存)。
原理:
优点:
  • 无锁机制,性能好,适合高并发场景。
  • 版本号天然支持分布式环境。
缺点:

总结与选择建议

  • 强一致性场景(如库存、支付):优先用分布式锁,严格控制读写顺序。
  • 高并发、可容忍短暂不一致:用延迟双删(简单)或版本号机制(性能好)。
  • 读多写少场景:用读写锁隔离,平衡性能和一致性。
http://www.jsqmd.com/news/346574/

相关文章:

  • 2026年东莞短视频代运营公司专业推荐:东莞石碣镇、石龙镇、茶山镇、石排镇、企石镇、横沥镇、桥头镇、谢岗镇、东坑镇短视频代运营公司 - 海棠依旧大
  • 基于Python+Django的控糖食物推荐系统(源码+lw+部署文档+讲解等)
  • autoware有日志,没有rviz界面/ autoware起不来
  • 别再混为一谈!万字拆解内存与显存:决定你模型训练成败的硬件真相
  • 2026年电动推杆公司公司权威推荐:电动推杆生产厂家/电动推杆销售厂家/电动推杆供应厂家/电动推杆供应商/电动推杆制造商/选择指南 - 优质品牌商家
  • 小模型十年演进
  • 2026年家装装修优质厂家排行榜,揭晓行业高口碑装修公司推荐 - 睿易优选
  • 2026电商场景多模态数据标注服务商推荐榜:智能驾驶数据标注服务/自动驾驶数据标注/语音数据标注/ai数据标注/选择指南 - 优质品牌商家
  • 动力学十年演进
  • 2026年东莞短视频代运营机构最新推荐:东莞石碣镇、石龙镇、茶山镇、石排镇、企石镇、横沥镇、桥头镇、谢岗镇、东坑镇短视频代运营公司、东莞恒锌网络本地化运营服务新标杆 - 海棠依旧大
  • java+vue+springboot机票预订管理系统_开题报告
  • 【毕业设计】基于Python的Django-html基于爬虫的贵州菜价可视化系统的设计与实现论文
  • 深耕江城团购赛道|三十六行杭州分公司,正重塑武汉商户增长路径 - 野榜数据排行
  • 滚珠丝杠十年演进
  • Java Agent入门基础教程(非常详细),手把手教你实现!
  • 运动学十年演进
  • 写论文软件哪个好?实测戳破3大谎言,虎贲等考AI凭真实感封神
  • iPhone 16 高质量评测:A18 / 相机控制 / Wi-Fi 7 / 官方规格维修手册速查(附图)
  • 微信排版素材网站推荐:3个实用公众号排版素材库一键提升排版效率 - peipei33
  • 【毕业设计】python基于人脸识别的票务系统
  • locomotion十年演进
  • 新手必备公众号排版工具!3个免费公众号编辑器推荐(2026最新版) - peipei33
  • 上海智推时代GEO上合作对接指南:高效建联技巧+官方渠道速查 - 速递信息
  • manipulation十年演进
  • 计算机毕业设计springboot基于Java的校园内餐厅外送系统 高校智慧餐饮配送服务平台的设计与实现 基于微服务架构的校内食堂在线订餐系统
  • 2026年评价高的角接触球轴承公司推荐:圆锥滚子轴承、机器人关节轴承、滚轮轴承、等载面壁轴承、精密转盘轴承、薄壁深沟球轴承选择指南 - 优质品牌商家
  • 2024年最新AIGC检测机制解析:如何让论文更像人写的 - 我要发一区
  • RV减速器十年演进
  • 计算机毕业设计springboot智慧社区服务平台 基于SpringBoot的社区数字化管理与生活服务平台 SpringBoot框架下的智能小区综合服务系统
  • 上海智推时代GEO合作:官方认证联系方式 - 速递信息