【Redis】事务的概念及用法

事务的概念及用法

  • 什么是事务
  • 事务的操作
    • 开启事务(MULTI)
    • 执行事务(EXEC)
    • 中止事务(DISCARD)
    • 为事务提供检查(WATCH)
    • 取消对key的监控(UNWATCH)
  • 为什么Redis不支持回滚 ?
  • 事务中的错误
  • Redis脚本
  • 总结

什么是事务

Redis的事务和MSOL的事务概念上是类似的.都是把一系列操作绑定成一组.让这一组能够批量执行

但是注意体会Redis的事务和MySQL事务的区别

  • 弱化的原子性:redis没有“回滚机制”只能做到这些操作批量执行”不能做到一个失败就恢复到初始状态
  • 不保证一致性:不涉及“约束”也没有回滚.MySQL的一致性体现的是运行事务前和运行后,结果都是合理有效的,不会出现中间非法状态
  • 不需要隔离性:也没有隔离级别,因为不会并发执行事务(redis单线程处理请求)
  • 不需要持久性:是保存在内存的.是否开启持久化,是redis-server自己的事情,和事务无关

Redis事务本质上是在服务器上搞了一个事务队列,每次客户端在事务中进行一个操作,都会把命令先发给服务器,放到”事务队列”中(但是并不会立即执行
而是会在真正收到EXEC命令之后,才真正执行队列中的所有操作

因此,Redis的事务的功能相比于MySQL来说,是弱化很多的.只能保证事务中的这几个操作是“连续的”不会被别的客户端加塞”仅此而已


事务的操作

开启事务(MULTI)

MULTI开启事务,执行成功后返回OK

127.0.0.1:6379> MULTI
OK

执行事务(EXEC)

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> incr k2
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 1

中止事务(DISCARD)

DISCARD可用于放弃当前的事务,丢弃命令队列,不执行任何命令,并且连接的状态恢复正常

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> incr k2
QUEUED
127.0.0.1:6379> DISCARD
OK

为事务提供检查(WATCH)

WATCH能够有效解决在并发情况下,可能出现的数据不一致的情况

WATCH在该客户端上监控一组具体的key
当开启事务的时候,如果对WATCH的key进行修改,就会记录当前key的“版本号(版本号是个简单的整数,每次修改都会使版本变大.服务器来维护每个key的版本号情况
在真正提交事务的时候,如果发现当前服务器上的key的版本号已经超过了事务开始时的版本号,就会让事务执行失败.(事务中的所有操作都不执行)

注意:在Redis版本6.0.9之前, 已过期的键不会导致事务中止。

事务内的命令不会触发WATCH条件,因为它们只排队,直到发送EXEC

WATCH可以多次调用。所有WATCH调用将具有从调用开始监视更改的效果,直到调用EXEC。您还可以将任意数量的键发送到单个WATCH调用中。
WATCH具体演示
可以看到当有另外的客户端对我们进行了WATCH操作的key进行修改的时候,事务就失效了

取消对key的监控(UNWATCH)

相当于WATCH的逆操作


为什么Redis不支持回滚 ?

Redis在事务失败时不支持回滚,而是继续执行余下的命令。

Redis命令只因为语法的错误而失败,或者命令用在了错误类型的键上面。也就是说,失败的命令是由编程错误造成的,而这些错误在开发过程中被发现,而不应该出现在生产环境中。
因为不需要对回滚进行支持,所以Redis的内部可以保持简单且快速。


事务中的错误

在事务中,可能会遇到两种类型的命令错误

  • 命令可能无法排队,因此在调用EXEC之前可能会发生错误。例如,命令在语法上可能是错误的(参数数量错误、命令名称错误等),或者可能存在某些关键条件,如内存不足条件(如果服务器使用maxmemory指令配置了内存限制)。
  • 命令可能在调用EXEC后失败,例如因为我们针对具有错误值的键执行了操作(例如,针对字符串值执行列表操作)。

从Redis2.6.5版本开始,服务器将检测在积累命令期间发生的错误。然后,它将拒绝执行事务,返回在EXEC期间的错误,并放弃该事务。

对于Redis版本 < 2.6.5:在Redis2.6.5之前,客户端需要检测在执行EXEC之前发生的错误,方法是检查排队命令的返回值:如果命令回复为QUEUED,则已正确排队,否则Redis将返回错误。如果在排队命令时发生错误,大多数客户端将中止并放弃事务否则,如果客户端选择继续事务,EXEC命令将执行所有已成功排队的命令,而不考虑之前的错误,发生在执行EXEC之后的错误不会以特殊方式处理:即使在事务过程中某些命令失败,所有其他命令仍将执行


Redis脚本

在Redis中进行事务操作的另一个要考虑的事项是Redis脚本(比如lua),它们是事务性的。您可以使用Redis事务执行的一切都可以使用脚本执行,通常脚本既更简单又更快。


总结

对于Redis来说,它本身支持事务的概念,但它不是传统意义上ACID的事务,同时也没办法保证数据的完整性,但是通过MULTI、EXEC、WATCH这样的机制可以保证应用之间的数据的隔离性,解决线程安全的问题

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

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

相关文章

为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度

本文要点 要点 Architecture程序 它被设计为一个双面神结构的控制器&#xff0c;它的两侧一侧编译执行另一侧 解释执行&#xff0c;自已则是一个 翻译器--通过提供两个不同取向之间 的 结构映射的显示器&#xff08;带 图形用户接口GUI和命令行接口CLI 两种 接口&#xff09…

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件&#xff0c;自动检测两个PDF文件之间的差异&#xff0c;并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分&#xff0c;帮助用户快速定位…

Flutter:搜索页,搜索bar封装

view 使用内置的Chip简化布局 import package:chenyanzhenxuan/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…

深度学习基础知识

深度学习是人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;领域的一个重要分支&#xff0c;以下是对深度学习基础知识的归纳&#xff1a; 一、定义与原理 定义&#xff1a;深度学习是一种使计算机能够从经验中学习并以概念层次结构的方式理解世界的机…

【Elasticsearch】腾讯云安装Elasticsearch

Elasticsearch 认识Elasticsearch安装Elasticsearch安装Kibana安装IK分词器分词器的作用是什么&#xff1f;IK分词器有几种模式&#xff1f;IK分词器如何拓展词条&#xff1f;如何停用词条&#xff1f; 认识Elasticsearch Elasticsearch的官方网站如下 Elasticsearch官网 Ela…

Ubuntu 24.04 LTS 通过 docker 安装 nextcloud 搭建个人网盘

准备 Ubuntu 24.04 LTSUbuntu 空闲硬盘挂载Ubuntu 安装 Docker DesktopUbuntu 24.04 LTS 安装 tailscale [我的Ubuntu服务器折腾集](https://blog.csdn.net/jh1513/article/details/145222679。 安装 nextcloud 参考 Ubuntu24.04系统Docker安装NextcloudOnlyoffice _。 更…

ThinkPHP 8的多对多关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

Spring Boot 整合 Knife4j:打造更优雅的 API 文档

在现代 Web 应用开发中&#xff0c;API 文档的重要性不言而喻。清晰、准确、易用的 API 文档不仅可以方便开发者理解和使用 API&#xff0c;还能提高团队协作效率。Knife4j 是一个基于 Swagger 的增强型 API 文档工具&#xff0c;它可以为 Spring Boot 项目生成美观、易于交互的…

计算机网络 (53)互联网使用的安全协议

一、SSL/TLS协议 概述&#xff1a; SSL&#xff08;Secure Sockets Layer&#xff09;安全套接层和TLS&#xff08;Transport Layer Security&#xff09;传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发&#xff0c;广泛应用于基于万维网的各种网络…

如何利用边缘节点服务打造极致用户体验?

随着互联网和数字化技术的飞速发展&#xff0c;用户对网络访问速度和服务体验的要求也在不断提高。在一个信息快速传播的时代&#xff0c;延迟过高或访问卡顿的问题会直接影响用户体验&#xff0c;甚至导致用户流失。因此&#xff0c;企业如何优化网络性能、提升用户访问速度&a…

React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目

在 React 企业级应用开发中&#xff0c;Next.js、Modern.js 和 Blitz 是三个常见的框架&#xff0c;它们提供了不同的特性和功能&#xff0c;旨在简化开发流程并提高应用的性能和扩展性。以下是它们的详解与比较&#xff1a; Next、Modern、Blitz 1. Next.js Next.js 是由 Ve…

如何在龙蜥 OS(AliOS)上安装极狐GitLab?

本文分享如何在龙蜥操作系统&#xff08;AliOS&#xff09;&#xff08;包括 RHCK 和 ANCK 两种&#xff0c;两种方式的安装流程一样&#xff09;上安装极狐GitLab&#xff1f; 前提条件 一个安装了龙蜥操作系统的云服务器 可以查看 /etc/os-release中的信息&#xff0c;确认…

if_yellow_only_restart_upgrading_nodes_with_unassigned_replicas

目录标题 遇事不决&#xff0c;上githubif_yellow_only_restart_upgrading_nodes_with_unassigned_replicas问题分析如何解决并使集群恢复到正常状态1. **检查和分配未分配的副本分片**2. **查看节点日志**3. **检查资源配置**4. **手动升级节点**5. **修改 if_yellow_only_res…

springboot中DTO、VO、Entity相互转换

在我们平时开发中&#xff0c;dto、vo、entity之间的相互转换是很频繁的操作&#xff0c;这篇就简单记录一下我在平时开发中转换的方法。 在这之前先简单描述一下dto、vo、entity DTO&#xff1a;一般我们在开发中会定义数据传输对象&#xff08;Data Transfer Object, DTO&am…

第四十七章 Spring之假如让你来写MVC——闪存管理器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

Python 脚本-扫描当前目录和所有子目录并显示它们的大小。

目录 1.Python 代码实现 2.Python 代码解释&#xff08;部分&#xff09; 1. 模块导入 2. ANSI 颜色编码 3. format_size 函数 4.get_directory_size 函数 5. scan_directory 函数 6. display_progress 函数 7. main 函数 3.运行脚本 3.1 基本用法 3.2 使用详…

基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

C语言基本知识

基础 存储类 auto&#xff1a;用完即丢。其实就是局部变量。 static&#xff1a;本文件的全局变量。 extern&#xff1a;只声明&#xff0c;不定义&#xff0c;引用外部变量。 register&#xff1a;放在寄存器而不是内存。 //auto {auto int month; // 等于int mount; …

使用批处理文件清除系统垃圾

第一步&#xff1a;打开记事本&#xff0c;里面的命令如下 echo off echo 正在清理临时文件&#xff0c;请稍候...:: 清理系统临时文件 echo 清理系统临时文件... del /q /f /s "%TEMP%\*.*" del /q /f /s "%WINDIR%\Temp\*.*" rd /s /q "%WINDIR%\T…

更新布局元素的属性

每个布局元素都有一组可以通过编程来更新的属性.布局元素有很多种不同的类型,如图例,图形,文本,地图整饰等等. 操作方法: 1.打开目标活动地图文档 2.打开python窗口 3.导入arcpy模块 import arcpy.mapping as mapping 4.引用当前活动地图文档,把该引用赋值给变量 mxd map…