博客
关于我
Redis与Mysql双写一致性方案解析
阅读量:737 次
发布时间:2019-03-21

本文共 1124 字,大约阅读时间需要 3 分钟。

Redis缓存更新策略是一个复杂但重要的设计问题,需根据具体场景选择合适的方法。以下是对几种策略的逐步分析及优化建议:

一、选型分析

目前共有三种主要策略:先更新数据库,再更新缓存;先删除缓存,再更新数据库;以及先更新数据库,再删除缓存。每种策略都有其独特的优缺点:

  • 先更新数据库,再更新缓存

    • 优点:简洁直接,更新策略容易实现。
    • 缺点:线程安全问题极易引发,可能导致多次更新,造成数据不一致。此外,对写入数据库后需要频繁更新缓存的场景不适用。
  • 先删除缓存,再更新数据库

    • 优点:避免线程安全问题,删除缓存确保单次更新。
    • 缺点:如果读操作并未完成,数据可能重入缓存,导致一致性失衡。吞吐量下降显著,需额外延迟策略。
  • 先更新数据库,再删除缓存

    • 优点:避免脏数据问题,吞吐量较高,效率更佳。
    • 缺点:在读操作并未完成时,可能导致数据重新写入缓存,从而导致不一致。需结合延迟策略确保一致性。
  • 二、统一建议

    各策略虽各有优劣,但均需应对数据一致性问题。以下方法可综合运用:

    • 延迟双删策略:增加延迟时间,确保所有相关数据读操作完成后再删除缓存。具体时间可根据项目读操作耗时评估,通常几百毫秒即可。

    • 异步删除:第二次删除可以异步执行,启动线程进行,以防止阻塞主线,保持高吞吐量。

    • 重试机制:删除失败时记录键信息,通过消息队列或定期任务重试,确保最终删除成功,防止数据不一致。

    • 一致性读操作:利用一致性读,确保所有修改前读操作完成,减少数据不一致的可能性。

    • 二级缓存:引入二级缓存或其他高级缓存方案处理问题,设置适当过期时间,自动清理脏数据。

    三、实施步骤

    根据选择的策略,具体实施步骤如下:

  • 延迟双删策略

    • 在首次删除缓存后,等待足够时间(如1秒),再次删除缓存。
  • 异步删除

    • 删除缓存失败后启动异步线程或定期任务,执行第二次删除操作,避免阻塞。
  • 重试机制

    • 删除失败记录键信息,启动重试过程(如消息队列或定时任务)。
  • 一致性读操作

    • 在删除缓存前,确保数据库已对于所有修改应用一致性读,确保读操作完成。
  • 二级缓存引入

    • 对于关键性的数据,引入二级缓存或其他缓存技术,处理一致性问题,并设置合适的过期策略。
  • 四、特定场景优化

    • 读多写少场景:延迟双删策略合适,确保读操作优先。

    • 高并发场景:结合异步删除和二级缓存,确保性能不受冲击。

    • 复杂计算缓存更新:对于需要复杂计算的更新,先删除缓存再计算后写入数据库,减少重复工作。

    五、预防不一致

    • 提供数据握销机制,确保数据库和缓存数据同步。

    • 自动清理策略,定期扫描旧数据,确保一致性。

    • 设定合理的偏好过期策略,减少脏数据存留。

    通过合理搭配这些策略,可以在保持系统性能和一致性的同时,提高数据安全性,确保系统的稳定运行。

    转载地址:http://bkhgz.baihongyu.com/

    你可能感兴趣的文章
    Oracle 数据类型
    查看>>
    Oracle 数据自动备份 通过EXP备份
    查看>>
    oracle 数据迁移 怎么保证 和原表的数据顺序一致_一个比传统数据库快 1001000 倍的数据库,来看一看?...
    查看>>
    oracle 时间函数
    查看>>
    oracle 时间转化函数及常见函数 .
    查看>>
    Oracle 权限(grant、revoke)
    查看>>
    oracle 查询clob
    查看>>
    Oracle 比较 B-tree 和 Bitmap 索引
    查看>>
    Oracle 注意点大全
    查看>>
    UML- 组件图(构件图)
    查看>>
    oracle 用户与锁
    查看>>
    oracle 由32位迁移到64位的问题
    查看>>
    oracle 监听器的工作原理
    查看>>
    oracle 行列转换
    查看>>
    oracle 行转列
    查看>>
    Oracle 表
    查看>>
    oracle 课堂笔记
    查看>>
    Oracle 返回结果集的 存储过程
    查看>>
    Oracle 递归
    查看>>
    Oracle 递归函数与拼接
    查看>>