2023-06-09:什么是Redis事务?原理是什么?

2023-06-09:什么是Redis事务?原理是什么?

答案2023-06-09:

Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令,而且所有命令都会按照指定的顺序经过序列化后被执行。在服务端执行事务的过程中,不受其他客户端发送给Redis的命令请求的干扰影响。

Redis 事务的注意点有哪些?

Redis事务的使用需要注意以下几点:

1.Redis 事务不支持回滚,不能像 MySQL 的事务那样可以选择性地输出。一旦命令提交给Redis,就会被执行,无法扔回到事务的起点。

2.Redis事务是原子执行的,要么全部执行成功,要么放弃执行。如果其中一个命令失败,则整个事务都会失败,但不会因为其中一个命令失败而导致其他命令的执行效果不确定。

3.执行事务期间,Redis服务器不会中断执行,也不会被其他客户机的请求干扰,这保证了事务操作期间的隔离性和原子性。

4.事务中的命令都是串行执行的,并且事务会尽量缩短命令合并的时间。如果有多个客户端同时访问同一个命令,会根据请求的时间顺序进行处理,避免了竞争和死锁。

Redis 事务为什么不支持回滚?

Redis事务执行期间不支持回滚的主要原因是为了避免增加复杂的实现逻辑和增加系统负担。 Redis只能通过在事务提交前执行所有命令来保证原子性的特性。如果Redis支持回滚,则必须存储事务执行前的状态,并在回滚后重置状态,这样会增加显著的存储和计算负担。

当命令执行期间发生语法错误等问题,Redis会在执行失败时报错,开发人员可以通过编写代码来处理这些错误。但是出现严重问题时,如网络故障或硬件问题等,Redis仍然会执行已经提交的事务命令,此时数据可能会出现严重不一致,需要开发人员自行修复。

总之,虽然没有回滚功能,但是Redis事务仍然是非常有用和实用的功能,能够提供高效、快速和可靠的多命令操作。开发人员需谨慎处理错误处理方式和保证数据一致性,以获得最佳实践的体验。

事务

事务是一组操作或动作的集合,这些操作要么全部执行,要么全部不执行。在执行事务期间,可以保证隔离性和原子性,即在同一事务中执行的操作相互独立,不受其他事务的干扰。如果其中一个操作发生错误,则仅回滚该事务,而不影响其他事务的执行结果。事务通常用于需要一系列操作来完成的任务,例如向数据库中插入多个数据,或将多个操作组合成一个原子操作。

以社交网站上用户A关注用户B为例,这个动作需要在用户A的关注表中添加用户B,并在用户B的粉丝表中添加用户A。将这两个操作组合成事务,可以确保在同一个事务中执行,要么全部执行,要么全部不执行。这样可以避免出现数据不一致的情况,确保关注关系的正确性。使用事务可以将多个数据库操作组合成一个原子操作,保证数据的一致性。

Redis提供了简单的事务功能,以multi命令开始事务,并在调用exec命令结束事务。将需要一起执行的命令放在multi和exec之间,Redis会将这些命令作为一个原子操作来处理,要么全部执行,要么全部不执行。如果在事务执行期间需要取消已经执行的命令,可以使用discard命令回滚整个事务。利用Redis的事务功能,可以执行多个命令并确保它们在同一个事务中执行,避免了因单个命令执行失败而导致的数据不一致问题。

一个客户端

image.png

另外一个客户端

在事务没有提交的时查询(查不到数据)

image.png

在事务提交后查询(可以查到数据)

image.png

可以看到sadd命令此时的返回结果是QUEUED,代表命令并没有真正执行,而是暂时保存在Redis中的一个缓存队列(所以discard也只是丢弃这个缓存队列中的未执行命令,并不会回滚已经操作过的数据,这一点要和关系型数据库的Rollback操作区分开)。

只有当exec执行后,用户A关注用户B的行为才算完成,如下所示exec返回的两个结果对应sadd命令。

但是要注意Redis的事务功能很弱。在事务回滚机制上,Redis只能对基本的语法错误进行判断。

如果事务中的命令出现错误,Redis 的处理机制也不尽相同。

1、语法命令错误

image.png

例如下面操作错将set写成了sett,属于语法错误,会造成整个事务无法执行,事务内的操作都没有执行:

2、运行时错误

例如:事务内第一个命令简单的设置一个string类型,第二个对这个key进行sadd命令,这种就是运行时命令错误,因为语法是正确的:

image.png

可以看到Redis并不支持回滚功能,第一个set命令已经执行成功,开发人员需要自己修复这类问题。

Redis的事务原理

Redis的事务是在服务器端实现的,当用户执行MULTI命令时,服务器将对应的客户端对象设置为一个专门的状态,此状态下所有后续用户所执行的查询命令都不会被立即执行,而是被保存在一个事务队列中,直到用户执行EXEC命令为止。在执行EXEC命令前或在事务途中,客户端可以随时调用DISCARD命令来取消事务。当用户执行EXEC命令时,服务器会将该客户端对象中缓存的命令按照它们提交的顺序依次执行,并将执行结果返回给客户端。使用Redis事务可以将一系列命令作为单个原子操作执行,从而保证了操作的一致性。

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

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

相关文章

深度研究微软的资产负债表和财务状况以及未来投资价值

来源:猛兽财经 作者:猛兽财经 微软股票的关键指标 猛兽财经认为,微软公布的2023财年第三季度财务业绩,有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%,从2022财年第…

从搭建hadoop开始学习大数据中分而治之的MapReduce(伪集群模式)

环境准备 首先需要将如下四个必要的文件下载到计算机(已经附上了下载地址,点击即可下载)。 Vmware Workstation 17.x 【官方的下载地址】 CentOS-7-x86_64-Minimal-2009【阿里云镜像站下载地址】 openjdk-8u41-b04-linux-x64-14_jan_2020【开…

踏上极速向未来之旅!——2023年量化科技嘉年华·专场回顾

2023年6月2日—3日,“2023量化科技嘉年华”在上海世博中心召开,这场为期两天的量化科技盛会,多方位呈现了量化科技创新成果,吸引了众多关注。 在嘉年华的第二天,多场主题论坛同步进行。 由华锐技术主办的“极速向未来…

ChatGPT 4 的 6 个最佳使用场景

作者:SYDNEY BUTLER 译者:明明如月 无论是在 ChatGPT 中还是通过 API,对 OpenAI 的 GPT-4 模型的访问比 GPT-3.5 限制更多。这意味着你需要慎重考虑在何种情况下使用 GPT-4,并选择性地将最适合的任务交给它,以便让其发…

短视频seo源代码部署步骤

一、 部署短视频SEO矩阵系统源代码,您需要遵循以下步骤: 准备服务器环境 首先,您需要准备一个服务器环境来托管源代码。您可以选择云服务器(例如AWS,阿里云等)或自己的私人服务器。 安装所需软件 在服务器…

Hbase

Hbase 思考环节: 1.什么是hbase 1.1简介 HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。 HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。 HBase 良好的分布式架构设计为海量数据的…

图神经网络 GNN 入门

参考链接 A Gentle Introduction to Graph Neural Networks (distill.pub) 零基础多图详解图神经网络(GNN/GCN)【论文精读】_哔哩哔哩_bilibili 目录 图的基本构成 图的表示方法 图的示例 图网络的基本任务 图网络的处理 影响图网络效果的超参数 …

快速创建Django项目

环境搭建 安装Django之前需要先安装python环境和pycharm。 目前 Django 1.6.x 以上版本已经完全兼容 Python 3.x。 python安装教程:https://blog.csdn.net/David_house/article/details/100110542 项目创建 打开pycharm,选择文件–>新建项目 创建D…

HUAWEI悦盒ec6108v9c 如何刷成海纳思系统(家用低功耗服务器,使用Home Assistant服务)

环境: 1.HW悦盒ec6108v9c一套 2.16G U盘 3.格式化软件USB_format.exe 4.固件 mv100-mdmo1g-usb-flash.zip(底层是Ubuntu 20.04系统) 5.十字螺丝刀 6.翘片/薄铲子 7.有线网络环境 8.镊子/回形针 问题描述: 最近玩智能家居…

【Linux】基本指令,拥抱Linux的第一步

[Linux]常见指令 Linux基本指令指令的本质ls指令pwd指令cd指令touch指令mkdir指令(重要)rmdir&&rm指令(重要)man指令(重要)cp指令(重要)mv指令(重要)重定向cat指令more指令less指令(重要…

Android Retrofit 给你的接口加上缓存

转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/131200501?spm1001.2014.3001.5501 本文出自 容华谢后的博客 往期回顾: Android Retrofit RxJava使用详解 Android 探讨一下Retrofit封装的最佳姿势 Android 谈谈我所理解的…

export 和 export default 的区别

一、铺垫 ES6模块化主要包含以下3种用法: ① 默认导出和默认导入---export default ② 按需导出和按需导入---export ③ 直接导入并执行模块中的代码 二、默认导出 语法:export default 需要共享的成员 创建一个共享的数据 order.js let name…

详解Eureka服务注册和调用

目录 1.概述 2.环境 2.1.项目结构 2.2.项目架构 2.3.依赖 3.注册中心 3.1.配置使用 3.2.管理页 3.3.集群 4.服务注册 5.服务调用 5.2.Ribbon 5.3.Feign 5.4.OpenFeign 1.概述 我们把从外部进入到微服务集群里的流量称为“南北流量”、微服务集群节点间流转的流量…

从零开发短视频电商 Jmeter插件安装和常用插件

Jmeter插件安装和常用插件 插件安装方式 一种是手动安装各种插件,下载对应的jar包,放到lib\ext目录下就可以使用了。另一种是通过漂亮的 UI ,jmeter 插件管理器Plugins Manager可以方便的管理其他插件的下载和更新。安装一次插件管理器&…

数据库SQL查询(一)

本文介绍SQL查询,如何在海量数据中筛选想要数据; 数据库管理系统选择:关系型数据库mysql 数据库管理工具选择:navicat 本文中查询语句和查询案例参考自:https://edu.csdn.net/course/detail/27673?ops_request_mis…

面试专题:计算机网络常见面试点总结

socket、tcp、udp、http 的认识及区别 socket、tcp、udp、http 的认识及区别​ 一、先来一个讲TCP、UDP和HTTP关系的 1、TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传…

【Django 网页Web开发】24. 实战项目:moudleForm的文件上传应用到城市管理(17)(保姆级图文)

目录 用户上传文件存放media如何启用1. 在urls.py中进行配置:2. 在settings.py中进行配置:3. 能够通过media的url访问文件 moudleForm上传文件实现城市管理1. moudle.py2. url.py3. city.py4. city.html5. 文件上传小结6. 城市管理效果总结 欢迎关注 『D…

基于Java菜匣子优选系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码)

人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码) 目录 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码) 1. 前言 2. 项目说明 (1)开发版本 (2)依赖库说明(O…

Docker部署gitlab-runner

gitlab-runner 1.部署 Linux使用二进制的方式Docker中使用容器的方式启动gitlab-runnerHelm包的方式安装gitlab-runner Docker中使用容器的方式启动gitlab-runner 1.安装gitlab runner docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/conf…