Redis---保证主从节点一致性问题 +与数据库数据保持一致性问题

保证主从节点一致性问题

Redis的同步方式默认是异步的,这种异步的同步方式导致了主从之间的数据存在一定的延迟,因此Redis默认是弱一致性的。
解决:
1.使用Redisson这样的工具,它提供了分布式锁的实现,确保在分布式环境中锁的正确性。
2.在Redis的配置中,我们可以设置必须有多少个客户端连接能够成功同步,这就是所谓的同步因子。通过合理配置同步因子,我们可以趋向于强一致性,减少主从之间的数据延迟。
3.使用命令 wait 2 0。这个命令会导致从节点等待一段时间来进行同步,但如果时间设置得不当,可能会导致数据同步的问题。因此,在使用这个命令时,我们需要谨慎设置等待时间,以免影响主从之间的数据一致性。

上述提到的“同步因子”和“wait命令”在某种程度上违背了Redis的初衷。Redis作为一款高性能的缓存和键值存储系统,其异步的同步方式和弱一致性正是为了追求更高的性能和吞吐量。如果我们需要更强的一致性,可能需要考虑其他的方案或者重新评估我们的架构设计。

与数据库数据保持一致性问题

如何保障redis和mysql的数据一致?
结论:在满足实时性的条件下,不存在两者完全保存一致的方案,只有最终一致性方案。
在这里插入图片描述

  1. 先写 MySQL,再写 Redis:数据不一致
    在这里插入图片描述
  2. 先写 Redis,再写 MySQL:数据不一致
    在这里插入图片描述
  3. 先删除 Redis,再写 MySQL:数据不一致
    在这里插入图片描述
  4. 先删除 Redis,再写 MySQL,再删除 Redis:这个也是大家常说的“缓存双删”。
    在这里插入图片描述
    对于蓝色的文字,“删除缓存 10”必须在“回写缓存10”后面,那如何才能保证一定是在后面呢?
    让请求 A 的最后一次删除,等待 500ms。----太 Low 了,风险也不可控
    异步串行化删除,即删除请求入队列----缓存删除失败,增加重试机制。可以借助消息队列的重试机制,也可以自己整个表,记录重试次数,
    在这里插入图片描述
  5. 先写 MySQL,再删除 Redis
    在这里插入图片描述
  6. 先写 MySQL,通过 Binlog,异步更新 Redis
    在这里插入图片描述
    这个方案,会保证 MySQL 和 Redis 的最终一致性,但是如果中途请求 B 需要查询数据,如果缓存无数据,就直接查 DB;如果缓存有数据,查询的数据也会存在不一致的情况。
    所以这个方案,是实现最终一致性的终极解决方案,但是不能保证实时性。

我们对比上面讨论的 6 种方案:

  1. 先写 Redis,再写 MySQL:这种方案,我肯定不会用,万一 DB 挂了,你把数据写到缓存,DB 无数据,这个是灾难性的;我之前也见同学这么用过,如果写 DB 失败,对 Redis 进行逆操作,那如果逆操作失败呢,是不是还要搞个重试?

  2. 先写 MySQL,再写 Redis:对于并发量、一致性要求不高的项目,很多就是这么用的,我之前也经常这么搞,但是不建议这么做;当 Redis 瞬间不可用的情况,需要报警出来,然后线下处理。

  3. 先删除 Redis,再写 MySQL:这种方式,我还真没用过,直接忽略吧。

  4. 先删除 Redis,再写 MySQL,再删除 Redis:这种方式虽然可行,但是感觉好复杂,还要搞个消息队列去异步删除 Redis。

  5. 先写 MySQL,再删除 Redis:比较推荐这种方式,删除 Redis 如果失败,可以再多重试几次,否则报警出来;这个方案,是实时性中最好的方案,在一些高并发场景中,推荐这种。

  6. 先写 MySQL,通过 Binlog,异步更新 Redis:对于异地容灾、数据汇总等,建议会用这种方式,比如 binlog + kafka,数据的一致性也可以达到秒级;纯粹的高并发场景,不建议用这种方案,比如抢购、秒杀等。

实时一致性方案:采用“先写 MySQL,再删除 Redis”的策略,这种情况虽然也会存在两者不一致,但是需要满足的条件有点苛刻,所以是满足实时性条件下,能尽量满足一致性的最优解。

最终一致性方案:采用“先写 MySQL,通过 Binlog,异步更新 Redis”,可以通过 Binlog,结合消息队列异步更新 Redis,是最终一致性的最优解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码生成器使用指南,JeecgBoot低代码平台

JeecgBoot 提供强大的代码生成器,让前后端代码一键生成,实现低代码开发。支持单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用。 同时提供强大模板机制,支持自定义模板,目…

Python 基础 (标准库):heapq (堆)

1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构(concrete data structures);优先级队列 priority queue 是一种抽象的数据结构(abstract data structures)&…

在非 antd pro 项目中使用 umi OpenAPI

大家好,我是松柏。自从跟着鱼皮哥使用了ant design pro中的OpenAPI插件之后,我已经无法忍受自己写请求后端接口的方法了,所以这篇文章记录一下如何在非ant design pro项目中使用OpenAPI。 安装依赖 首先我们需要安装包umijs/openapi&#x…

上交举办“大模型奥林匹克竞赛”,GPT-4o仅得39分

大模型的奥林匹克竞赛来了! 最近,上交构建了一个全面、极具挑战性的奥赛级别的基准——OlympicArena,从来自62个不同奥林匹克竞赛中筛选出11,163个问题,涵盖数学、物理、化学、生物、地理、天文学和计算机科学等七个学科&#xf…

[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

Opencv_CUDA应用之 使用背景相减法进行对象跟踪 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程,它广泛应用于对象检测和跟踪应用中去除背景 背景相减法分四步进行:图像预处理 -> 背景建模 -> 检测前景 -> 数据验证 预处理去除…

AD9026芯片开发实录6-example code

官方发布的软件包中,带了一份example code,用于向客户展示API的调用方法以及基于官方的验证版ADRV902X最简单的bring up的流程。 该 example 位于软件包的路径下:“\Adi.Adrv9025.Api\src\c_src\app\example\”。 代码组成: initd…

使用ElementUI组件库

引入ElementUI组件库 1.安装插件 npm i element-ui -S 2.引入组件库 import ElementUI from element-ui; 3.引入全部样式 import element-ui/lib/theme-chalk/index.css; 4.使用 Vue.use(ElementUI); 5.在官网寻找所需样式 饿了么组件官网 我这里以button为例 6.在组件中使用…

【QT】常用控件|widget|QPushButton|RadioButton|核心属性

目录 ​编辑 概念 信号与槽机制 控件的多样性和定制性 核心属性 enabled geometry ​编辑 windowTiltle windowIcon toolTip styleSheet PushButton RadioButton 概念 QT 控件是构成图形用户界面(GUI)的基础组件,它们是实现与…

搜维尔科技:数据手套为什么要选择SenseGlove

了解 SenseGlove SenseGlove 是一支由电子工程师、触觉研究人员和计算机视觉专家、XR 开发人员、UX 设计师和产品创新者组成的科幻爱好者团队,他们拥有丰富人类能力和赋予 Metaverse 意义的技能和热情。 推进触觉技术是我们实现这一目标的方式。 公司及产品背景 S…

【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结

文章目录 1、语句(1)简单语句A.空语句B.复合语句 (2)条件语句(3)迭代语句A.常规for循环B.范围for循环C.while和do...while (4)跳转语句A.break语句B.continue语句C.goto语句 (5)异常处理语句A.标准异常B.throw抛出异常 (6)try语句 2、运算符(1)算术运算符(2)关系运算符(3)逻辑运…

Cybervadis认证是什么?

Cybervadis认证是一种全面且深入的网络安全评估和认证服务,旨在帮助组织提高其网络安全实践的成熟度,并有效应对不断变化的网络威胁和攻击。以下是关于Cybervadis认证的一些关键信息: 认证目的: 评估和验证组织在网络安全方面的能…

Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了

昨天凌晨,知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想:完全由神经网络驱动的计算机,不再依赖传统的软件代码。 嗯,这是什么意思?全部原生LLM硬件设备的意思吗&#xff1f…

HarmonyOS开发实战:UDP通讯示例规范

1. UDP简介 UDP协议是传输层协议的一种,它不需要建立连接,是不可靠、无序的,相对于TCP协议报文更简单,在特定场景下有更高的数据传输效率,在现代的网络通讯中有广泛的应用,以最新的HTTP/3为例,…

vmware虚拟机安装openEuler

一、openEuler简介 openEuler是一款开源操作系统。当前openEuler内核源于Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、…

EEPROM内部原理

A2, A1, A0是EEPROM的地址引脚,用于设置设备地址。它们的作用如下: 设备寻址: 这三个引脚允许在I2C总线上唯一地标识EEPROM芯片。通过不同的连接方式(接高、接低或悬空),可以为同一类型的EEPROM芯片设置不同…

1uH电感SK6615电流1.5A频率2MHz输入5.5V同步降压转换器

SK6615C 1.5A 2MHz 5.5V同步降压转换器 SK6615 SOT23-5封装和丝印LA 描述 该SK6615C是一款高效、DC-DC降压型开关稳压器,能够提供高达1.5A的输出电流。该器件的工作输入电压范围为 2.6V 至 5.5V,输出电压范围为 0.6V 至 VIN。工作频率为2MHz&#xff0c…

02.C1W1.Sentiment Analysis with Logistic Regression

目录 Supervised ML and Sentiment AnalysisSupervised ML (training)Sentiment analysis Vocabulary and Feature ExtractionVocabularyFeature extractionSparse representations and some of their issues Negative and Positive FrequenciesFeature extraction with freque…

玩具租赁系统(安装+讲解+源码)

技术栈: 后端: SpringBoot Mysql MybatisPlus 前端: Vue Element 分为 管理员端 用户端 功能: 用户端 管理员端 观看地址: B站搜: 【毕设者】玩具租赁系统(安装讲解源码)

Java高级重点知识点-13-数据结构、List集合、List集合的子类

文章目录 数据结构List集合List的子类(ArrayList集、LinkedList集) 数据结构 栈 stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作…

cesium 添加 Echarts图层(人口迁徒图)

cesium 添加 Echarts 人口迁徒图(下面附有源码) 1、实现思路 1、在scene上面新增一个canvas画布 2、通坐标转换,将经纬度坐标转为屏幕坐标来实现 3、将ecarts 中每个series数组中元素都加 coordinateSystem: ‘cesiumEcharts’ 2、示例代码 <!DOCTYPE html> <ht…