【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,一经查实,立即删除!

相关文章

两份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博客 编程与应用开…

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

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

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

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

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…

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

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

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

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

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

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

Linux——信号量和(环形队列消费者模型)

Linux——线程条件变量&#xff08;同步&#xff09;-CSDN博客 文章目录 目录 文章目录 前言 一、信号量是什么&#xff1f; 二、信号量 1、主要类型 2、操作 3、应用场景 三、信号量函数 1、sem_init 函数 2、sem_wait 函数 3、sem_post 函数 4、sem_destroy 函数 ​​​​​​…

垂直供排水抢险车:守护城市,抗击洪涝|深圳鼎跃

我国面积幅员辽阔&#xff0c;其灾害种类多样&#xff0c;而洪涝灾害是其中最常见的灾害&#xff0c;其容易受强降雨的影响&#xff0c;严重影响人民群众的日常生活。而在洪水肆虐的场景中&#xff0c;快速、高效地排涝和供水是防止次生灾害、保护人民生命财产安全的关键环节。…

Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译

概要 行人遵循不同轨迹以避免障碍物和容纳同行者。任何在这种场景中巡航的自动驾驶车辆都需要能够遇见行人的未来位置并相应地调整其路线以避免碰撞。轨迹预测问题能够被看作一个顺序生成任务&#xff0c;其中我们对基于行人过去的位置预测其未来的轨迹感兴趣。根据最近RNN&am…

React+AntDesign实现类似Chatgpt交互界面

以下是一个基于React和Ant Design搭建的简单ChatGPT风格前端交互界面代码框架示例&#xff0c;该示例实现了基本的用户输入、发送请求以及展示回复的功能。假设后端有一个模拟接口来处理请求并返回回复。 1. 项目初始化&#xff1a; 确保你已经安装了Node.js和npm。通过以下命…

与“神”对话:Swift 语言在 2025 中的云霓之望

0. 引子 夜深人静&#xff0c;是一片极度沉醉的黑&#xff0c;这便于我与深沉的 macbook 悄悄隐秘于其中。一股异香袭来&#xff0c;恍惚着&#xff0c;撸码中身心极度疲惫、头脑昏沉的我仿佛感觉到了一束淡淡的微光轻洒在窗边。 我的对面若隐若现逐渐浮现出一个熟悉的身影。他…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中&#xff0c;网络请求是常见且致其重要的功能之一。从获取资料到上传数据&#xff0c;出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架&#xff0c;提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…

【C++】引用(上)

1、引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型&#xff08;该数据类型要与原名的数据类型一致&#xff09; &别名原名&#xff1b; 示例&#xff1a; #include<iostream> using namespace std; int main() {int a 10;int& …