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

如何保证数据库和缓存一致性问题

如何保证数据库和缓存一致性问题

我刚开始以为数据一致性指的是不同请求拿到的数据是一样的,但是这个对于一致性的定义其实是强一致性。

为了保证系统的可用性和性能,我们选择的是牺牲强一致性来获取最终一致性,那么接下来我们只需要保证最终一致性而无需考虑整个过程中的数据强一致性。我们使用的是旁路缓存的方式。

对于读策略,如果缓存没有过期,直接读取即可。如果缓存过期,可以选择客户端线程或者是redis的后台线程去读数据库的数据,然后更新到缓存中,最后再返回给客户端。

对于写策略,有两种方式,先更新数据库,后删缓存。先删缓存,后更新数据库。

对于先删缓存,后更新数据库来说,假设线程A删缓存,此时线程B访问数据,发现数据不在缓存中。那么线程B需要去数据库中获取数据再将数据放到缓存中,等到线程A更新完数据库后,此时数据库和缓存中的数据不一样,无法保证最终一致性。对于先更新数据库,后删缓存来说,线程A先进行数据库的更新,此时线程B访问缓存有数据直接返回,接着线程A再进行缓存的删除,此时可以保证缓存和数据库的一致性。后续请求访问缓存时,没有命中会到数据库中进行获取对应数据。有一种特殊情况,线程B在缓存中没有找到数据,去数据库中进行数据的查找,线程A更新数据库,等到线程A删除缓存中的数据后,线程B再将之前获取的数据放到缓存中。由于线程B拿到的数据是在线程A更新数据库之前的,那么此时会存在数据库和缓存数据不一致的问题,但是这样的概率会很低,因为将数据写到缓存中的速度大于线程A更新数据库的速度

删除缓存一般存在两种方式:通过设置数据的过期时间和直接删除的方式。

通过设置数据的过期时间比较麻烦,设置过小,缓存没有起到缓存效果,请求会发到数据库中,造成数据库的压力。设置过大,缓存和数据库之间数据延迟较大,且浪费内存。

因此我们选择直接删除的方式来进行优化。此时我们需要保证直接删除能够成功,否则旧有数据一直存放到缓存中,会造成数据一致性问题。


对于直接删除数据会有两种方式。

一种是删除数据重试策略,我们会将需要删除的数据放在消息队列中,由客户端去获取需要删除的数据,尝试删除,如果删除成功那么将消息从消息队列中进行移除,如果没有成功那么重新尝试几次。尝试几次依然没有成功,需要向业务层反馈这个问题。

这种方式缺点是我们需要通过在代码中写死向mq队列发送特定要删除的数据。

另外一种是通过订阅binlog + canal + 消息队列方式。我们通过订阅binlog,将数据解析为结构化数据存放到消息队列中,接着编写一个简单的消费数据的消费者订阅mq,接着通过获取数据的key来完成删除操作。通过ack机制来保证数据一致性问题。

这种方式我们通过订阅binlog。数据发生更新,此时binlog会发生改动,那么canal能够察觉binlog的变化并将改动后的信息发送给mq。这样子并不需要我们硬编码,来完成数据的删除操作。缺点是实现起来比较麻烦。

http://www.cnnetsun.cn/news/117210.html

相关文章:

  • 【数据集】上市公司-人工智能采纳程度测算数据(2003-2024年)
  • Uppy智能文件过滤:从混乱上传到精准控制的革命性方案
  • Nginx性能优化终极指南:Linux服务器加速实战技巧
  • AI销售自动化与客户管理的最佳获客软件选择--VertGrow AI销冠
  • Naive UI 图片预览实用技巧:打造专业画廊效果的高效方法
  • 前沿速递 | Adv. Eng. Mater.:基于LPBF与压力渗透的FeSi2.9-Bakelite多功能复合材料设计与性能调控
  • Mermaid Live Editor 终极指南:实时图表编辑的完整解决方案
  • Drawnix白板工具:用代码思维重塑图形设计工作流
  • Monaco Editor代码提示响应优化实战指南
  • 下一代前端开发:用Next.js与大模型AI,零代码解锁你的智能助手
  • 跨越浏览器壁垒:Skyvern如何实现自动化脚本的通用兼容性
  • 应用现代化 | 金融智能风控的新标尺——《金融级智能应用能力要求 风控场景》标准正式发布
  • Undetectable接入亮数据代理ip做自媒体矩阵
  • 如何用lidR包3步完成激光雷达林业精准分析:从点云到决策的完整指南
  • 初识操作系统
  • Android端AI模型部署终极指南:从入门到精通
  • RuoYi-Vue3企业级管理系统:现代化开发框架实战指南
  • MCP协议驱动企业级AI集成:芋道源码的智能化升级实践
  • 终极指南:使用gsplat.js实现高性能3D高斯点云渲染
  • 把CNN和SVR捏在一起做预测这事儿,乍听有点玄乎,实操起来倒挺有意思。咱们今天不整那些虚头巴脑的理论,直接上手撸代码。先甩个模型结构出来镇楼
  • Memobase完整安装指南:构建AI长期记忆系统的7个关键步骤
  • Faiss HNSW性能瓶颈突破:5步诊断与3倍提速优化实战
  • 5个立竿见影的wgpu性能优化技巧:让你的Rust图形应用帧率翻倍
  • 1000 人并发 + 4K 高清,3 大行业案例见证协作效率翻倍
  • 字符串的拼接函数:strcat()
  • GraphRAG-Local-UI终极指南:本地知识图谱构建与智能查询完整教程
  • Messari:Flow 生态 2025 年 Q3 发展概览
  • Draft.js工具栏深度定制:构建企业级富文本编辑器的完整实践
  • 下一个版本EmotiVoice将带来哪些惊喜?
  • 明诺多功能全自动洗地机,适用于超市、地库及商场清洁需求