Redis与MySQL数据库数据一致性方案

一致性方案的设计原则

  • 数据一致性:确保Redis和MySQL中的数据在任何时候都是一致的,即任何对数据的修改在Redis和MySQL中都应同步体现
  • 事务性:确保数据同步操作具有原子性,即要么全部成功,要么全部失败。
  • 持久性:确保即使系统崩溃或重启,已同步的数据也不会丢失。

实现方案

设置缓存key过期时间

  • 此方案只适用对数据一致性要求很低或写请求很少的业务,当查询没有命中缓存时,就从数据库中读,把查到的数据写到缓存,同时设置缓存的过期时间。
  • 写操作直接更改数据库,不用更新缓存。但是当一个key没过期时,写操作已更新数据库数据,此时的读还是读取到旧数据。此时就出现数据不一致了。

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

  • 此方案适用于读多写少的场景。但是可能会出现更新完数据库还未更新缓存,此时的查询操作查询缓存则是更新之前的数据,就会造成数据不一致了

先删除缓存,再更新数据库

  • 先删除缓存,如果删除成功再去更新数据库,就算数据库更新失败,再次读取数据库缓存到redis数据还是一致的。
  • 但是高并发的情况下,如果A删除完缓存,A再去更新数据库,在更新的过程后,B来查询数据,发现缓存没有,就从数据库获取并更新缓存,后面A更新成功,就会出现缓存和数据库不一致。如果后面一直没有更新操作,则缓存则与数据库一直不一致了,所以这种情况给缓存设置一个过期时间,做一个兜底操作

延时双删

  • 先删除缓存数据,再更新数据库数据,等待一小段时间,再次删除缓存数据(可以另开线程执行删除,也可以设置删除重试次数,避免删除失败)
  • 存在的问题:无法绝对保障数据的一致性,因为延迟时间难以确认,如果偏大也会造成系统性能问题,所以到底是延迟多长时间,这个很难确认,偏小又起不到延时双删的作用。所以延时时间还得根据实际场景做出评估。

使用消息队列

  • 先更新数据库,然后将删除缓存的消息投递到消息队列中。收到删除缓存消息后,尝试进行删除缓存。如果失败,则不断进行重试。
  • 引入了消息队列,系统的复杂性提升,可用性降低。也会带来各种各样的问题,例如消息丢失、乱序与重复消费等。在删除缓存的场景下,乱序与重复消费不会造成任何问题。但是消息丢失则会导致数据不一致情况。

监听binlog

  • 异步监听binlog:监听数据库的binlog,检测到数据更新则去删除缓存,如果删除失败则通过MQ不断重试,直至删除成功,业务代码只操作数据库,不操作缓存。同时启动一个订阅binlog的程序去监听删除操作,然后投递到消息队列中。再启动一个消费者,根据消息去删除缓存。在MySQL中,可以使用Canal中间件来订阅binlog。
  • 该方案使用一个中间件来帮我们完成解耦工作,但也让系统的复杂度逐步上升。

总结

大量数据同步可能导致Redis和MySQL的性能下降,也会增加系统的复杂性,维护成本也会上升,在选择方案时要针对自己的业务场景选择合适的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/557013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STL的stack和queue(三):基于适配器模式的反向迭代器

目录 前言 list的反向迭代器 list.h文件 ReverseIterator.h文件 test.cpp文件 前言 迭代器按性质分类: 单向:forward_list双向:list随机:vector / deque 迭代器按功能分类: 正向反向const list的反向迭代器…

【笔试强训】Day2 --- 牛牛的快递 + 最小花费爬楼梯 + 数组中两个字符串的最小距离

文章目录 1. 牛牛的快递2. 最小花费爬楼梯3. 数组中两个字符串的最小距离 1. 牛牛的快递 【链接】&#xff1a;牛牛的快递 解题思路&#xff1a;简单模拟题&#xff0c;主要是处理⼀下输⼊的问题。 #include <iostream> #include <cmath> using namespace std;…

我与C++的爱恋:日期计算器

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们通过上述内容&#xff0c;来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…

鸿蒙开发语言_ArkTS开发语言体验_TypeScript语言环境搭建_TS声明和数据类型---HarmonyOS4.0+鸿蒙NEXT工作笔记003

可以看到我们新建的这个项目,有个 @State message: String =Hello ArkTS 这个就是定义了一个变量,可以看到 message是变量名,String是变量类型. 然后我们可以看看它的结构可以看到 build() 下面有个Row,然后再下面有个Column方法,然后,里面就是具体的内容了,首先就是显示了一…

高速公路车型识别系统的新篇章:激光雷达解决方案的探索与应用

高速公路车型识别系统&#xff1a;激光雷达解决方案的探索与应用 随着智能交通领域的迅速发展&#xff0c;高速公路车型识别技术成为提高交通管理效率与安全性的关键一环。激光雷达作为一种高精度、高可靠性的传感器技术&#xff0c;在高速公路车型识别中展现出巨大的应用潜力…

华强电子网(www.hqew.com)2023年度电子行业优秀国产品牌企业评选

华强电子网&#xff08;www.hqew.com&#xff09;2023年度电子行业优秀国产品牌企业评选&#xff0c;历经四个月的激烈竞争和严格审核&#xff0c;经过企业提名、专家筛选、公众投票和专家评审四大阶段&#xff0c;近千家电子行业企业成功提名&#xff0c;其中有超过200家国产品…

像经典编程一样简单!MIT科学家开发新型量子计算机模型

量子计算软件市场预计将迎来指数级增长&#xff0c;预测到2030年其复合年增长率&#xff08;CAGR&#xff09;将达到21.9%。这不仅预示着前所未有的计算能力的解放&#xff0c;而且能够帮助各行各业解决极其复杂的问题。 量子计算软件包括一系列工具、算法和编程语言&#xff0…

Training - PyTorch Lightning 的 Horovod 策略实践 (all_gather)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137686312 在 PyTorch Lightning 中使用 Horovod 策略&#xff0c;可以在多个 GPU 上并行训练模型。Horovod 是分布式训练框架&#xff…

Linux sudo suid提权练习

题目比较简单&#xff0c;可以利用sudo和多种suid程序提权&#xff0c;做个记录 进入靶场题目环境 获得节点信息 远程连接上 执行命令id&#xff0c;发现只是admin普通账户 sudo提权 发现存在 /usr/bin/vim, /usr/bin/bash, /usr/bin/more, /usr/bin/less, /usr/bin/nano, /…

CSS入门:link链接样式和4种状态的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具…

React + 项目(从基础到实战) -- 第九期

实现分页 , LoadMore 上划加载更多功能效果 分页 page : 当前页 pageSize: 页面大小 自定义分页组件 组件传值 import {FC , useEffect, useState } from reactimport { useNavigate , useLocation ,useSearchParams} from react-router-dom;import { Pagination } from &quo…

每日两题3

礼物最大价值 class Solution { public:int jewelleryValue(vector<vector<int>>& frame) {int m frame.size(),n frame[0].size();vector<vector<int>> dp(m1,vector<int>(n1,0));for(int i 1; i < m;i){for(int j 1; j < n;j){d…

轻松点餐|餐饮小程序新玩法,美食触手可及

在企业经营领域&#xff0c;小程序正成为越来越多行业开展线上经营的重要工具。依托小程序等工具自主开发数字化经营平台&#xff0c;已经成为零售、餐饮等日常消费行业的趋势。餐饮行业向智能化快速迭代已势在必行&#xff0c;在此进程中&#xff0c;小程序成为了备受餐饮商家…

Mysql嵌套查询太简单了

1、子查询的分类 不相关查询&#xff1a; 子查询能独立执行 相关查询&#xff1a; 子查询不能独立运行 相关查询的执行顺序&#xff1a; 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询, 若WHERE子句返回值为真&#xff0c;则取此元组放入结果…

SpringBoot整合PDF动态填充数据并下载

目录 目录 一、准备环境 二、iTextPDF介绍 三、步骤 四、访问查看结果 五、源代码参考 一、准备环境 ①下载一个万兴pdf软件 ②准备一个pdf 文件 二、iTextPDF介绍 这是一个用于生成PDF文档的Java库&#xff0c; 文档创建与修改&#xff1a;iTextPDF能够从零开始创建…

2024红明谷杯——Misc 加密的流量

2024红明谷杯——Misc 加密的流量 写在前面&#xff1a; 这里是贝塔贝塔&#xff0c;照例来一段闲聊 打比赛但赛前一波三折&#xff0c;又是成功签到的一个比赛 说起来比赛全名叫红明谷卫星应用数据安全场景赛&#xff0c;但好像真的跟卫星的关系不大&#xff0c;没有bin方…

面试Spring框架

什么是Spring框架&#xff1f; Spring框架是一个开源的Java应用程序框架&#xff0c;提供了综合的基础设施支持&#xff0c;用于开发Java企业应用程序。它涵盖了从基本的核心容器到全面的企业服务&#xff0c;可以用于构建任何规模的应用程序。 Spring框架的核心特性是什么&am…

Go之map详解

map的结构 map实现的两个关键数据结构 hmap 定义了map的结构bmap 定义了hmap.buckets中每个bucket的结构 // A header for a Go map. type hmap struct {count int // 元素的个数flags uint8 // 状态标记&#xff0c;标记map当前状态&#xff0c;是否正在写入B …

<计算机网络自顶向下> 可靠数据传输的原理(未完成)

可靠数据传输&#xff08;rdt&#xff1a;Reliable Data Transfer&#xff09;的原理 rdt在应用层&#xff0c;传输层和数据链路层都很重要是网络TOP10问题之一信道的不可靠特点决定了可靠数据传输rdt的复杂性rdt_send: 被上层&#xff08;如应用层&#xff09;调用&#xff0…

41.缺失的第一个正数

1. 解题原理&#xff1a; &#xff08;1&#xff09;对于一个有序的、不缺失元素的正数数组nums&#xff0c;元素nums[i]应当位于nums[i]-1的位置处。 &#xff08;2&#xff09;nums数组的长度为N&#xff0c;缺失的第一个正数如果不位于[1,N]&#xff0c;那么就肯定是N1 2. …
最新文章