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

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

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

一、选型分析

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

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

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

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

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

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

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

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

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

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

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

    三、实施步骤

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

  • 延迟双删策略

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

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

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

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

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

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

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

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

    五、预防不一致

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

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

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

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

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

    你可能感兴趣的文章
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>
    Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime(72)
    查看>>
    Node-RED中使用JSON数据建立web网站
    查看>>
    Node-RED中使用json节点解析JSON数据
    查看>>
    Node-RED中使用node-random节点来实现随机数在折线图中显示
    查看>>
    Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
    查看>>
    Node-RED中使用node-red-contrib-image-output节点实现图片预览
    查看>>
    Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
    查看>>
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>
    Node-RED中实现HTML表单提交和获取提交的内容
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    node-request模块
    查看>>
    Node.js 8 中的 util.promisify的详解
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 历史
    查看>>
    Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
    查看>>
    Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
    查看>>
    Node.js 异步模式浅析
    查看>>
    node.js 怎么新建一个站点端口
    查看>>