redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题 的策略,通常在高并发场景下使用。以下是其核心内容:

1. 问题背景

当更新数据库时,如果未及时删除或更新缓存,可能导致后续读请求仍从缓存中读取旧数据,造成数据不一致。

2. 延迟双删的核心逻辑

在更新数据库前后各执行一次缓存删除操作,并在第二次删除时增加延迟:

  1. 第一次删除缓存:在更新数据库前,先删除缓存中的旧数据。
  2. 更新数据库:执行数据库写操作。
  3. 延迟后第二次删除缓存:等待一段时间(如500ms),确保数据库写操作已完成,再次删除缓存。

示例代码(伪代码):

python 复制代码
def update_data(key, new_value):
    # 第一次删除缓存
    redis.delete(key)
    
    # 更新数据库
    db.update(key, new_value)
    
    # 延迟后第二次删除缓存(防止数据库更新过程中有新写入缓存)
    time.sleep(0.5)  # 延迟时间根据数据库性能调整
    redis.delete(key)

3. 为什么需要延迟?

  • 数据库写入耗时:数据库写操作可能比缓存删除慢,延迟可确保数据库更新完成后再删除缓存。
  • 避免脏读:若在更新数据库后立即删除缓存,可能因网络延迟等问题,导致缓存未及时删除,后续请求仍读取旧数据。

4. 适用场景

  • 读多写少:频繁读取热点数据时,确保缓存与数据库一致。
  • 强一致性要求:对数据一致性敏感的业务(如订单状态、库存)。

5. 优缺点

  • 优点 :
    • 简单直接,减少缓存与数据库不一致的概率。
    • 适用于大多数高并发场景。
  • 缺点 :
    • 两次删除操作增加系统开销。
    • 延迟时间需根据数据库性能合理设置,过短可能无效,过长影响性能。

6. 优化建议

  • 设置缓存过期时间:作为双删的补充,即使双删失败,缓存也会在过期后自动更新。
  • 异步处理延迟删除:通过消息队列(如Kafka)异步执行第二次删除,降低同步延迟对性能的影响。
  • 监控与重试:记录双删失败的键,通过定时任务重试删除。

7. 替代方案

  • 先更新数据库,再更新缓存:需处理缓存更新失败的重试逻辑。
  • 异步删除缓存:通过订阅数据库binlog,异步触发缓存删除(如Canal工具)。
  • 使用本地缓存+定时刷新:适用于允许短暂不一致的场景。

总结

延迟双删是一种折中方案,在保证数据一致性和系统性能之间取得平衡。实际应用中需结合业务需求选择策略,并通过监控和测试验证效果。

相关推荐
w-w0w-w3 小时前
SQL注入
网络·数据库·sql
tianyuanwo3 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼3 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
我不会起名字3224 小时前
Redis 从 0 到 1(十七):订单 30 分钟不支付自动关闭——ZSet 延迟队列 Go 实现
redis·go·延迟队列·zset·订单
IvorySQL4 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql
利威尔xu4 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
幽灵诶5 小时前
Mysql(基于测试的学习)
数据库·mysql
砚底藏山河5 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
利威尔xu6 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
宇宙无敌暴龙战士6666 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发