【系统架构设计 每日一问】三 Redis支持事务么,Redis的事务如何保证
实际上,关于Redis事务的说法“Redis 的事务只能保证隔离性和一致性(I 和 C),无法保证原子性和持久性(A 和 D)”并不完全准确。下面我将分别解释Redis事务的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
1. 原子性(Atomicity)
Redis的事务通过MULTI
、EXEC
、DISCARD
等命令实现,它们确保了一个事务中的所有命令要么全部执行,要么全部不执行。这是通过Redis将事务中的命令先放入队列,然后在EXEC
命令执行时统一执行这些命令来实现的。如果在EXEC
执行前遇到错误(如命令不存在或语法错误),则整个事务会被取消,所有命令都不会执行,这体现了原子性。
2. 一致性(Consistency)
Redis的事务在执行过程中会保持数据的一致性。这意味着事务执行前后,数据库从一个一致的状态转换到另一个一致的状态。如果事务执行过程中发生错误,Redis会回滚事务(尽管Redis不直接支持传统意义上的事务回滚,但通过不执行有错误的命令来间接实现),从而保持数据的一致性。
3. 隔离性(Isolation)
Redis的隔离性主要体现在它使用单线程来处理命令,这避免了多线程环境下的并发问题。在Redis中,事务的执行是串行的,即一个事务在执行过程中不会被其他事务的命令打断。此外,Redis还提供了WATCH
命令来实现乐观锁,进一步增强了事务的隔离性。Redis使用单个线程来处理网络I/O和键值对读写操作,这确实保证了操作的原子性和顺序性,但在处理并发事务时,仍然需要一种机制来确保数据的一致性和隔离性。这就是WATCH命令的作用所在。以下是详细解释:
Redis的单线程模型
Redis的单线程模型主要是指其网络I/O和键值对读写操作是由一个主线程来完成的。这种设计简化了数据结构的操作,避免了多线程编程中的竞态条件和锁开销,从而提高了性能。然而,单线程模型并不意味着Redis不能处理并发请求,它通过IO多路复用技术(如epoll)来高效地处理多个客户端的连接和请求。
WATCH命令的必要性
尽管Redis是单线程的,但在处理并发事务时仍然可能遇到数据不一致的问题。这是因为Redis允许多个客户端同时连接到服务器,并可能对相同的键值对进行操作。如果两个或多个客户端几乎同时开始一个事务,并尝试修改同一个键值对,那么按照Redis的单线程执行顺序,后一个事务可能会基于前一个事务未提交的数据进行修改,从而导致数据不一致。
为了解决这个问题,Redis提供了WATCH命令。WATCH命令的作用是在事务执行之前,监视一个或多个键。如果在WATCH之后、EXEC之前,这些键中的任何一个被其他命令修改了(无论是被当前客户端还是其他客户端修改),那么当前客户端的事务将被打断,EXEC命令会执行一个空事务,并返回nil回复表示事务执行失败。
WATCH命令的作用
- 实现乐观锁:WATCH命令通过监视键的变化来实现乐观锁机制。这种机制假设在事务执行期间,不会有其他客户端修改被监视的键。如果发生了修改,则放弃事务,从而避免数据不一致的问题。
- 保证事务的一致性:在并发环境下,多个客户端可能同时尝试修改同一个键值对。通过WATCH命令,Redis可以确保在事务执行期间,被监视的键没有被其他客户端修改,从而保证事务的一致性。
避免脏读和不可重复读:在数据库事务中,脏读和不可重复读是常见的问题。通过WATCH命令,Redis可以避免在事务执行期间读取到被其他事务修改过的数据,从而避免脏读和不可重复读的问题。
使用场景
WATCH命令通常用于实现分布式锁、排他性访问等并发场景下的数据一致性问题。通过监视键的变化,可以确保在事务执行期间数据的一致性,从而提高系统的并发能力和稳定性。
4. 持久性(Durability)
Redis的持久性并不完全由事务本身保证,而是依赖于Redis的持久化机制。Redis提供了两种持久化方式:RDB(Redis Database)和AOF(Append Only File)。
- RDB:通过定期将内存中的数据快照保存到磁盘上来实现持久化。但是,RDB在事务执行期间不会执行,因此它不能保证事务中只执行了一部分的数据会被持久化。
- AOF:通过记录每个写命令到文件中,并在系统重启时重新执行这些命令来恢复数据。如果开启了AOF并且配置了合适的
fsync
策略,那么Redis可以在一定程度上保证事务的持久性。但是,如果Redis在EXEC
命令执行后、数据写入磁盘前崩溃,那么已经提交的事务可能会部分丢失。
因此,说Redis的事务“无法保证持久性”是不准确的。实际上,Redis的持久性取决于其持久化机制的配置和使用情况。
综上所述,Redis的事务能够保证原子性、一致性和隔离性,而持久性则依赖于Redis的持久化机制。所以,原问题中的说法需要被纠正。
相关文章:
【系统架构设计 每日一问】三 Redis支持事务么,Redis的事务如何保证
实际上,关于Redis事务的说法“Redis 的事务只能保证隔离性和一致性(I 和 C),无法保证原子性和持久性(A 和 D)”并不完全准确。下面我将分别解释Redis事务的四个特性:原子性(Atomicit…...

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.3应用架构
前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…...

DasViewer打开Revit输出的fbx格式的模型,为啥一团黑?
答:这个应该是没有读取到贴图文件。贴图文件和obj文件需要在同级目录下面。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 免…...

【05】LLaMA-Factory微调大模型——初尝微调模型
上文【04】LLaMA-Factory微调大模型——数据准备介绍了如何准备指令监督微调数据,为后续的微调模型提供高质量、格式规范的数据支撑。本文将正式进入模型微调阶段,构建法律垂直应用大模型。 一、硬件依赖 LLaMA-Factory框架对硬件和软件的依赖可见以下…...

Training for Stable Diffusion
1.Training for Stable Diffusion 笔记来源: 1.Denoising Diffusion Probabilistic Models 2.最大似然估计(Maximum likelihood estimation) 3.Understanding Maximum Likelihood Estimation 4.How to Solve ‘CUDA out of memory’ in PyTorch 5.pytorch-stable-d…...

初学51单片机之指针基础与串口通信应用
开始之前推荐一个电路学习软件,这个软件笔者也刚接触。名字是Circuit有在线版本和不在线版本,这是笔者在B站看视频翻到的。 Paul Falstadhttps://www.falstad.com/这是地址。 离线版本在网站内点这个进去 根据你的系统下载你需要的版本红线的是windows…...

【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选
今年,“串串房”一词频繁引发广大网友关注。“串串房”,也被称为“陷阱房”“贩子房”——炒房客以低价收购旧房子或者毛坯房,用极度节省成本的方式对房子进行装修,之后作为精修房高价租售,因甲醛等有害物质含量极高&a…...
Linux 驱动学习笔记
1、驱动程序分为几类? • 内核驱动程序(Kernel Drivers):这些是运行在操作系统内核空间的驱动程序,用于直接访问和控制硬件设备。它们提供了与硬件交互的底层功能,如处理中断、访问寄存器、数据传输等。 •…...

ip地址设置了重启又改变了怎么回事
在数字世界的浩瀚星海中,IP地址就如同每个设备的“身份证”,确保它们在网络中准确无误地定位与通信。然而,当我们精心为设备配置好IP地址后,却时常遭遇一个令人费解的现象:一旦设备重启,原本设定的IP地址竟…...
layui table 浮动操作内容收缩,展开
layui table 隐藏浮动操作内容 fixed: right, style:, title: 操作,align:left, minWidth: 450, toolbar:#id分析: 浮动一块新增一个class layui-table-fixed-r 可以隐藏整块内容进行,新增一个按钮点击时间,然后进行收缩和展开 $(‘.layui-…...

Ubuntu24.04 NFS 服务配置
1、NFS 介绍 NFS 是 Network FileSystem 的缩写,顾名思义就是网络文件存储系统,它允许网络中的计算机之间通过 TCP/IP 网络共享资源。通过 NFS,我们本地 NFS 的客户端应用可以透明地读写位于服务端 NFS 服务器上的文件,就像访问本…...

vue3使用html2canvas
安装 yarn add html2canvas 代码 <template><div class"container" ref"container"><div class"left"><img :src"logo" alt"" class"logo"><h2>Contractors pass/承包商通行证&l…...

OpenCV分水岭算法watershed函数的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 我们将学会使用基于标记的分水岭算法来进行图像分割。我们将看到:watershed()函数的用法。 任何灰度图像都可以被视为一个地形表…...

laravel为Model设置全局作用域
如果一个项目中存在这么一个sql条件在任何情况下或大多数情况都会被使用,同时很容易被开发者遗忘,那么就非常适用于今天要提到的这个功能,Eloquent\Model的全局作用域。 首先看一个示例,有个数据表,结构如下࿱…...

Leetcode之string
目录 前言1. 字符串相加2. 仅仅反转字母3. 字符串中的第一个唯一字符4. 字符串最后一个单词的长度5. 验证回文串6. 反转字符串Ⅱ7. 反转字符串的单词Ⅲ8. 字符串相乘9. 打印日期 前言 本篇整理了一些关于string类题目的练习, 希望能够学以巩固. 博客主页: 酷酷学!!! 点击关注…...

OS:处理机进程调度
1.BackGround:为什么要进行进程调度? 在多进程环境下,内存中存在着多个进程,其数目往往多于处理机核心数目。这就要求系统可以按照某种算法,动态的将处理机CPU资源分配给处于就绪状态的进程。调度算法的实质其实是一种…...
【车辆轨迹处理】python实现轨迹点的聚类(一)——DBSCAN算法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、单辆车轨迹的聚类与分析1.引入库2.聚类3.聚类评价 二、整个数据集多辆车聚类1.聚类2.整体评价 前言 空间聚类是基于一定的相似性度量对空间大数据集进行分组…...
Apache Kylin
Apache Kylin 是一个开源的分布式分析引擎,提供 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据集。它能在亚秒级的时间内提供 PB 级数据的查询能力,非常适合大数据分析和报表系统。 ### 入门指南 #### 1. 环境准备 首先…...

为何Vue3比Vue2快
Proxy响应式 PatchFlag 编译模板时,动态节点做标记标记,分为不同的类型,如TEXT PROPSdiff算法时,可以区分静态节点,以及不同类型的动态节点 <div>Hello World</div> <span>{{ msg }}</span>…...

人工智能与社交变革:探索Facebook如何领导智能化社交平台
在过去十年中,人工智能(AI)技术迅猛发展,彻底改变了我们与数字世界互动的方式。Facebook作为全球最大的社交媒体平台之一,充分利用AI技术,不断推动社交平台的智能化,提升用户体验。本文将深入探…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...