Redis如何保证数据一致性?

Redis如何保证数据一致性?

Redis通常作为持久层数据库(例如MySQL)的缓存层,如果缓存或者数据库数据发生改变,如何保证双方的数据是一致的?

在这里插入图片描述

这其实是要分情况讨论滴,对数据一致性不同的要求有不同的解决方案,主要分为一致性要求高的(最终一致性、绝对一致性),一致性要求低的

数据一致性要求高

Cache Aside Pattern旁路缓存策略

双写一致性:当修改了数据库的数据也同时更新缓存的数据,缓存和数据库的数据保持一致

  1. 当数据提交更新时,先删除缓存,再更新数据库
  2. 当数据提高更新时,先更新数据库,再删除缓存

但是这两种方案都存在脏数据的风险

先删除缓存,再更新数据库,假如在线程1更新数据库的期间,有其他的线程访问数据,那么所有的线程都会去访问到数据库,并且拿到的是旧数据,放入到缓存中

在这里插入图片描述

先更新数据库,再删除缓存,假如在线程1查询数据库的期间,其他线程对数据库进行了修改,并且删除了缓存,在线程1查询完数据过后将旧的数据写入到了缓存中

在这里插入图片描述

总而言之,无论先删除缓存还是先更新数据库都会存在数据不一致的问题,但是先更新数据库再删除缓存产生数据不一致的概率比较低,因为写入缓存的速度一般是远远快于更新数据库的操作,并且如果数据库更新失败,先删缓存,缓存不会回滚,而后删缓存,数据库更新失败,缓存不会被删除

延迟双删

延迟双删,在写库完成后,删除缓存,写库的线程睡眠一段时间再次删除缓存

在这里插入图片描述

为什么要使用延迟双删?其实就是考虑到上图中的极端情况,一个读线程发现缓存中没有对应的数据,去查库,在查询完毕准备更新缓存期间,另一个写线程完成了写库以及对缓存的删除此时数据库中的数据是新数据,而读线程将缓存更新为旧数据),一般情况下,这种事件的发生概率很低,但是使用延迟双删可以规避掉这种问题,进一步提高数据的一致性,但缺点就是性能会有所下降

那具体的超时时间要根据你具体的业务来定,一般设置几秒足够了

如何避免删除缓存失败的情况?

MQ方案

在这里插入图片描述

可以使用一个MQ队列接受删除失败的key,使用一个消费者监听MQ队列,一旦有删除Redis失败的消息,就去进行删除重试

监听binlog日志

在这里插入图片描述

阿里巴巴有一个专门的中间件,负责监听binlog日志,一旦binlog发生了变动,cannel就会通知cannel的客户端,cannel客户端负责进行缓存的删除操作(同时支持重试)

总结:这两种方案核心就是将删除缓存的操作异步化了,并且支持重试

难道没有保证数据绝对一致性的方案吗?读写锁

读写锁(数据绝对一致性)

读写锁:给读操作加读锁,给写操作加写锁,读锁允许其他线程进行读操作但是不能进行写操作写锁不允许其他线程进行读、写操作

例如下面这个栗子

当线程对数据进行读操作,其他所有对数据进行写操作的线程都将被阻塞,但是可以进行读操作

在这里插入图片描述

当线程对数据进行写操作时,其他所有对数据进行读写操作的线程都将被阻塞

在这里插入图片描述

优点:读写锁保证了数据库与缓存之间的数据强一致性

缺点:加上读写锁之后,访问数据的速度将变得缓慢,有点违背了加缓存的初衷,所以,但你的数据是写多于读的,不建议放入缓存中

数据一致性要求低

系统对于数据的实时一致性要求没那么高,例如视频播放量、点赞数、社交媒体动态

怎么解决?

  1. 异步更新策略:使用MQ作为消息中间件,更新缓存后,通知缓存删除
  2. 缓存失效策略:设置合适的缓存失效时间,让缓存在一定时间内保持一致性,在超时后从数据库获取新数据即可

总结

对于数据一致性高的场景,旁路缓存中先更新数据库再删缓存已经能保证绝大情况下的数据一致性,如果要求再高点可以考虑上延迟双删,同时加中间件避免缓存删除失败。不推荐上读写锁,因为缓存本身就是为了提高性能的,读写锁对性能的影响较大。

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

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

相关文章

Tomcat、MySQL、Redis最大支持说明

文章目录 一、Tomcat二、MySQL三、Redis1、最大连接数2、TPS、QPS3、key和value最大支持 一、Tomcat 查看SpringBoot内置Tomcat的源码,如下: 主要就是看抽象类AbstractEndpoint,可以看到默认的核心线程数10,最大线程数200 通过…

docker学习笔记(三)搭建NFS服务实验

目录 什么是NFS 简单架构​编辑 一.搭建nfs服务器 二.新建共享目录和网页文件 三.设置共享目录 四:创建使用nfs共享目录的卷 五:创建容器使用nfs-web-1卷 六:测试访问 七:是否同步测试 什么是NFS NFS 服务器:ne…

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3 环境准备创建虚拟环境下载微调工具 LLaMA-Factory下载 llama3-8B开始微调测试微调结果模型合并后导出vllm 加速推理 环境准备 autodl 服务器: https://www.autodl.com/console/homepage/personal 基本上充 5 块钱…

美团二面:SpringBoot读取配置优先级顺序是什么?

引言 Spring Boot作为一种轻量级的Java应用程序框架,以其开箱即用、快速搭建新项目的特性赢得了广大开发者的青睐。其核心理念之一就是简化配置过程,使开发者能够快速响应复杂多变的生产环境需求。为了实现这一点,Spring Boot支持丰富的外部…

接口加密解决方案:Python的各种加密实现

01 前言 在现代软件开发中,接口测试已经成为了不可或缺的一部分。随着互联网的普及,越来越多的应用程序都采用了接口作为数据传输的方式。接口测试的目的是确保接口的正确性、稳定性和安全性,从而保障系统的正常运行。 在接口测试中&#…

Spring Security初探

url说明方法/login/oauth/authorize无登录态时跳转到/authentication/require,有登录态时跳转到/loginorg.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint#authorize/authentication/require自己写的用于重定向到登录页面的urlcn.merryy…

市场公关人的日常工作是什么?

作为一个从事多年的市场公关人,每到别人放假的时候就是我们最忙的时候,手上几个KOL项目安排探店,同时还要筹备品牌VIP活动。扎堆的事情每天忙得睁眼就是工作。 基本上来说,公关人是挺苦逼的,并没有大家看上去那么光鲜…

Julia编程语言基本语法

1、Julia读取/保存csv数据 读取: using CSV df CSV.read("mydata.csv")保存为csv格式: # 创建 DataFrame df DataFrame(height h, discharge q) # 将 DataFrame 写入 CSV 文件 CSV.write("output.csv", df)报错:Un…

Ruby中的字符串转换方法

在Ruby中,你可以使用各种方法来转换字符串。下面是一些常用的方法,当然选择哪种适用的方法还得更具具体项目来做调整。日常使用中下面的错误也是比较常见的,看看我们怎么处理哈。 1、问题背景 在Python中,内置的数据结构都有一个…

成功解决:Could not install packages due to an OSError

成功解决:Could not install packages due to an OSError: 错误: ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: C:\Users\XIAODA~1\AppData\Local\Temp\pip-install-yeyhod79\opencv-contribpython_fb…

C++:位图和布隆过滤器

一,位图 1.1 位图的概念 究竟什么是位图呢??我们用一道问题来引入 问题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】 根据这个问题&#x…

通俗易懂讲解 nginx-rtmp-module 是干嘛的?

文章目录 概述安装 nginx 和 nginx-rtmp-module配置 Nginx启动 Nginx使用示例推流拉流转码鉴权与安全自动录制 概述 nginx-rtmp-module 是一个用于 Nginx 的第三方模块,它扩展了 Nginx 服务器的功能,使其能够处理实时流媒体数据,特别是支持 …

【LeetCode】环形链表I 环形链表II

一、环形链表I 题目 思路 该题使用快慢指针 slow、 fast slow 走一步 ,fast 走两步 当fast 走到空 或者 fast的下一个结点为空, 则无环 fast若追上slow , 则有环 结论证明 该思路默认了 : 若存在环形链表 , 无论…

代码随想录算法训练营第二十一天:树树树

代码随想录算法训练营第二十一天:树树树 ‍ 513.找树左下角的值 力扣题目链接​**(打开新窗口)** 给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: ​​ 示例 2: ​​ #算法公开课 《代码随想录》算法视频公开课…

领域驱动设计架构演进

领域驱动设计由于其强调对领域的深入理解和关注业务价值,其架构演进依赖于领域的变化和特定领域中的技术实践。 初始阶段 一个单体架构,所有的功能都集成在一个应用程序中,领域模型可能还不完全清晰,甚至并未形成。这个阶段主要是为了验证产品的可行性,快速迭代并尽快推…

OpenCV单窗口并排显示多张图片

OpenCV单窗口并排显示多张图片 效果代码 PS:本例的代码适合图片的宽度和高度都相同。 效果 原始三张图片: 合并显示: 代码 import cv2 import numpy as npdef opencv_multi_img():# 读取图片img1 cv2.imread(saw_1.jpeg)img2 cv2.im…

【爬虫】爬取A股数据写入数据库(二)

前几天有写过一篇 【爬虫】爬取A股数据写入数据库(一),现在继续完善下,将已有数据通过ORM形式批量写入数据库。 2024/05,本文主要内容如下: 对东方财富官网进行分析,并作数据爬取,使…

【高阶数据结构(二)】初识图论

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:高阶数据结构专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 高阶数据结构 1. 前言2. 图的基…

LED显示屏控制器5个问题和解答

在LED电子显示屏的使用和维护过程中,用户经常会遇到各种技术问题。以下是五个关于LED电子显示屏控制器的常见问题及其解答,由专业LED显示屏生产厂家提供,旨在帮助用户更好地理解和使用LED显示屏。 1. 嵌入式实时脱机二合一控制器的工作原理 嵌…

SpringCloud Alibaba Sentinel 修改Dashboard用户名和密码

目录 一、下载Sentinel的Jar包 二、在启动时修改用户名和密码的命令 三、测试登录成功 在网上找到了一大堆文章,没一个有用的,最终还是通过不断测试找到了这个方法。 一、下载Sentinel的Jar包 Releases alibaba/Sentinel GitHub 二、在启动时修改…