什么是Redis数据一致性?如何解决?

在系统中缓存最常用的策略是:服务端需要同时维护DB和cache,并且是以DB的结果为准–Cache-Aside Pattern(缓存分离模式、旁路缓存)

读数据

在这里插入图片描述

单纯的读数据是不会产生数据不一致,只有并发下读和写才会存在数据不一致。

写数据

  1. 更新缓存再更新数据库
  2. 删除缓存再更新数据库
  3. 更新数据库再更新缓存
  4. 更新数据库再删除缓存

以上操作步骤总结下来就是两点:

  • 更新缓存还是删除缓存?
    • 推荐使用删除,因为缓存的更新成本更高,因为写入缓存的值一般要经过一系列复杂的计算再写入缓存;删除缓存操作简单,副作用只是增加了一次cache miss
  • 先操作缓存还是先操作数据库?

数据不一致

先操作缓存

image

经过上述过程之后,出现了数据不一致;redis中是老的数据,而DB中是新的数据(写延迟);所有后续其他的线程都是从缓冲中拿到的老数据,直至该老数据缓存过期。

如何解决这种情况下的数据不一致性?
image

通过延迟双删的策略可以解决,且保证了最终一致性。虽然线程2依然拿到的是老数据,但是后面的线程拿到的都是新数据。

最终一致性:最终能够保证redis和DB的一致性。
强一致性:redis操作和DB操作设置成原子操作,虽然保证了一致性但是降低了吞吐量,违背了使用redis的初衷。

先操作数据库

image

通过先操作数据库,然后操作缓存,虽然线程2在删除之前拿到的是老数据(脏数据),但是可以保证最终一致性,推荐使用该方式

删除重试

上述两种方式不管是延迟双删还是先操作数据库,保证最终一致性的前提是删除缓存成功,如果在极端条件下删除缓存失败怎么办?
在这里插入图片描述

如上图所示,通过向MQ发送异步消息,通知客户端进行重试删除来解决。引入canal组件,可将该删除重试功能从业务代码中解耦,canal客户端可以使用springboot应用来实现。

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

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

相关文章

python2.7+rf框架搭建

一 下载pycharm 可下载最新版:https://www.jetbrains.com/pycharm/download/#sectionwindows 新建项目时需要关联python2.7,这个必须要python2.7安装好之后关联才生效,若也关联了,但创建项目后有弹框显示类似“项目创建失败”的提…

人工智能常用的编程语言有哪些?

人工智能常用的编程语言包括Python、Java、C、R、Lisp和Prolog等。具体选择取决于项目需求、技术背景和性能要求。 Python是AI领域的明星语言,由于其简洁易懂的语法、丰富的库支持以及庞大的社区资源,适用于机器学习、深度学习和自然语言处理等领域。 …

千万级数据用什么数据结构判断某个数据是否存在?

面试题,如何在千万级的数据中判断一个值是否存在?-腾讯云开发者社区-腾讯云 (tencent.com) 使用布隆过滤器。 数组大小和hash函数数量如何确定? 通过公式可以得出(与log2有关) 使用什么hash函数? murm…

算法练习第四十二天|01背包问题、416. 分割等和子集

一些背包问题 01背包问题 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自…

nvme协议学习总结

一、nvme命令 1 nvme在pcie基础上的协议,与PCIE配合,实现高效传输。 2 nvme命令主要分IO命令和admin命令。 3 一个NVME CMD执行流程: step1:host把cmd写入SQ queue中; step2:host远端更新Device&#x…

如何优化Java程序的性能?

优化Java程序的性能是一个多方面的任务,它涉及到代码设计、算法选择、内存管理、并发处理等多个方面。以下是一些建议,帮助你优化Java程序的性能: 一、代码和算法优化 1、选择合适的数据结构和算法:确保你的代码使用了最有效的数…

C++从入门到精通——nullptr

nullptr 前言一、指针空值NULL二、指针空值nullptr(C11)C98中的指针空值 三、NULL与nullptr的区别总结 前言 nullptr是C11引入的一个新特性,用于表示空指针。它提供了一种类型安全的方式来区分空指针和非空指针,避免了传统空指针(如NULL或0&…

BIT-5-动态内存管理(C语言进阶)

本章重点 为什么存在动态内存分配动态内存函数的介绍 mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题柔性数组 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟…

华为OD面试手撕算法-字符串压缩

题目描述 本题是leetcode原题:字符串压缩 字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串"aabcccccaaa"会变为"a2b1c5a3"。若“压缩”后的字符串没有变短&#xf…

瑞吉外卖实战学习--12、分类管理的修改和删除接口实现

分类管理的修改和删除的接口实现 前言获取接口的方法修改接口的连接请求方式和参数删除接口的连接请求方式和参数 实现接口 前言 本篇实现分类的管理的修改和删除接口,在平时项目中最常用的就是增删改查接口,通过页面来的到请求的接口和方法然后通过创建…

在Java中对SQL进行常规操作的通用方法

SQL通用方法 一、常规方法增删改查二、具体优化步骤1.准备工作2.getcon()方法,获取数据库连接对象3.closeAll()方法,关闭所有资源4.通用的增删改方法5.通用的查询方法6.动态查询语句 总结 一、常规方法增删改查 在常规方法中,我们在Java中对…

建独立站,对FP商家有什么好处?

2024年都过去四分之一了,还有许多人对是否投身于跨境独立站领域仍犹豫不决。然而,观望不如实践,如果渴望在跨境电商领域开创一片新天地,那么现在就是行动的最佳时机。 特别是对于FP商家来说,由于电商平台对于黑五类产品…

数据挖掘|贝叶斯分类器及其Python实现

分类分析|贝叶斯分类器及其Python实现 0. 分类分析概述1. Logistics回归模型2. 贝叶斯分类器2.1 贝叶斯定理2.2 朴素贝叶斯分类器2.2.1 高斯朴素贝叶斯分类器2.2.2 多项式朴素贝叶斯分类器 2.3 朴素贝叶斯分类的主要优点2.4 朴素贝叶斯分类的主要缺点 3. 贝叶斯分类器在生产中的…

滑动窗口最大值_单调队列_java

滑动窗口最大值 leetcode链接 问题描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 提示&#xff1a; 1 < nums…

SD-WAN降低网络运维难度的三大关键技术

企业网络作为现代企业不可或缺的基础设施&#xff0c;承担着连接全球的重要任务。随着全球化和数字化转型的加速推进&#xff0c;企业面临着越来越多的网络挑战和压力。传统的网络组网方式已经不能满足企业规模扩大、分支机构增多、上云服务等需求&#xff0c;导致了网络性能下…

设计模式之命令模式 ,Php高级编程

命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而允许你将不同的请求排队或记录请求日志、撤销操作等。该模式的优势在于可以将请求发送者和接收者完全解耦&#xff0c;调用某些对象的某些方法&#x…

双机 Cartogtapher 建图文件配置

双机cartogtapher建图 最近在做硕士毕设的最后一个实验&#xff0c;其中涉及到多机建图&#xff0c;经过调研最终采用cartographer建图算法&#xff0c;其中配置多机建图的文件有些麻烦&#xff0c;特此博客以记录 非常感谢我的同门 ”叶少“ 山上的稻草人-CSDN博客的帮助&am…

部署项目遇到的各种问题总结

文章目录 前言一、后端问题 jar包运行出现错误宝塔面板使用jdk17二、数据库问题 版本问题三、前端问题 连不上后端总结 前言 在做完项目之后&#xff0c;为了让别人访问到自己的网站&#xff0c;就需要部署前端后端以及数据库&#xff0c;但是在部署的过程中出现了各种问题和困…

【微服务篇】深入理解分布式消息队列系统

分布式消息队列是一种在多个服务器、应用或服务之间进行消息传递的技术。它使得各个独立的组件可以通过异步消息进行通信&#xff0c;提高了系统的可扩展性、解耦性和可靠性。 典型应用场景 1. 异步处理 在许多系统中&#xff0c;某些任务的处理可能需要较长时间&#xff0c…

VUE——概述

vue是前端框架&#xff0c;基于MVVM思想。 引入 从官网下载vue文件 <script src"js/vue.js"></script> 定义vue对象 new Vue({el: "#x",//vue接管区域&#xff0c;#表示选择器&#xff0c;x是id名字data: {message: "y"} })案例…