Redis事务长什么样?一文带你全面了解

一、概述

1.1、Redis事务简介

在 Redis 中,事务是一组命令的有序队列,Redis 使用 MULTI、EXEC、WATCH 和 DISCARD 等命令来实现事务。事务的执行是原子的,要么所有命令都执行成功,要么所有命令都不执行。事务中的命令在 EXEC 执行之前不会被实际执行,而是先进入队列,从而实现了原子性操作。

1.2、Redis事务方案

  1. Redis事务(Transactions):
  • Redis事务允许你将一系列命令作为一个原子操作来执行。你可以使用MULTI开始事务,然后添加多个命令,最后使用EXEC提交事务。
  • 事务可以包含多个命令,但如果在事务执行期间发生了错误或数据被修改,所有的操作都会被回滚,不会执行任何改变数据的命令。
  1. Redis脚本(Scripting):
  • Redis脚本是使用Lua语言编写的脚本,可以在Redis服务器上原子性地执行。
  • 脚本可以包含多个命令,这些命令将被作为一个整体在服务器上执行,要么全部成功,要么全部失败,保证原子性。
  • 脚本在执行时是单线程的,这意味着它们不会被其他命令或脚本中断,这有助于确保原子性和一致性。
  1. 脚本 vs. 事务:
  • 虽然事务和脚本都可以实现一组命令的原子性执行,但在某些情况下,脚本可能更为简单和高效。
  • 脚本在执行时不需要将多个命令发送到服务器,而是将整个脚本作为一个单一的操作发送,这可以减少通信开销,提高性能。
  • 另外,脚本还可以在执行期间访问参数,使其更加灵活。

对于简单的操作,事务可能足够,但对于更复杂的操作或需要原子性保证的情况,脚本可能是更好的选择。总体而言,Redis脚本提供了更灵活、更高效的方式来执行一系列命令。

二、命令事务实现步骤

使用watch、multi、exec等命令来实现一个简单的转账事务:

step1:设置两个账户的初始余额

# 设置两个账户的初始余额
set account1 100
set account2 50

step2:使用watch命令监视两个账户的余额

WATCH命令用于监视一个或多个键,以实现乐观锁(Optimistic Locking)。通过使用WATCH,你可以指定一组键,如果这些键在事务执行期间被其他客户端修改,事务将被取消。这允许你在执行事务之前检查被监视的键是否发生了变化,从而保证事务的原子性。

# 使用watch命令监视两个账户的余额
watch account1 account2

step3:开启事务并执行事务

# 使用multi命令开启事务
multi
# 在事务中,将account1的余额减少10,将account2的余额增加10
decrby account1 10
incrby account2 10
# 使用exec命令提交事务
exec

step4:事务异常模拟

在multi执行之后exec执行之前,如果再开启一个窗口来操作account1,这时第一个窗口的事务就会执行失败,数据的值不会被改变。

比如在执行multi后,新开一个窗口执行:

窗口2:

set account1 200

然后再回到第一个窗口执行剩下的事务命令,最后就会提示异常:

三、Redis脚本事务

Redis官方提到在Redis中,除了使用传统的事务(通过MULTI、EXEC等命令)外,还可以通过Redis脚本来实现类似事务的操作,而且通常情况下脚本会更简单和更快,这里说的脚本就是我们常使用的Lua脚本。

四、Redis事务特点

Redis的事务有以下特点:

  • Redis的事务是乐观锁的,也就是说,如果事务中涉及的键在执行前被其他客户端修改,那么事务会被中断,不会执行任何命令。这是通过WATCH命令来实现的,它可以监视一个或多个键,如果这些键在事务执行前被修改,那么事务会失败。这样可以保证事务的隔离性和一致性。
  • Redis的事务是基于队列的,也就是说,当客户端执行MULTI命令后,开始一个事务,之后发送的所有命令都会被放入一个队列中,而不是立即执行。只有当客户端执行EXEC命令时,才会触发事务中的所有命令的执行。如果客户端执行DISCARD命令,那么会取消事务,放弃执行队列中的所有命令。

五、Redis事务应用场景

Redis的事务可以用于一些需要保证数据完整性和一致性的场景,例如:

  • 购物车结算:当用户结算购物车时,需要从库存中扣除相应的商品数量,同时更新用户的订单信息。这两个操作需要在一个事务中完成,否则可能会出现库存和订单不一致的情况。可以使用WATCH命令来监视库存的键,如果在事务执行前,库存被其他用户修改,那么事务会失败,提示用户重新结算。
  • 秒杀活动:当用户参与秒杀活动时,需要判断商品是否还有剩余,如果有,就扣除一个商品,并生成一个订单。这两个操作也需要在一个事务中完成,否则可能会出现超卖的情况。同样可以使用WATCH命令来监视商品的键,如果在事务执行前,商品被其他用户抢购,那么事务会失败,提示用户秒杀失败。
  • 排行榜更新:当用户完成某个任务或者获得某个成就时,需要更新用户的积分,并将用户的排名插入到相应的排行榜中。这两个操作也需要在一个事务中完成,否则可能会出现积分和排名不一致的情况。可以使用WATCH命令来监视用户的积分键,如果在事务执行前,用户的积分被其他操作修改,那么事务会失败,提示用户重新更新。

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

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

相关文章

Avalonia学习(二十五)-系统界面

目前项目式练习,界面内容偏多,所以不给大家贴代码了,可以留言交流。此次为大家展示的是物联项目的例子,仅仅是学习,我把一些重点列举一下。 界面无边框 同前面 treeview控件 通过treevie控件导航 tabcontrol控件 …

AUTOSAR CP--chapter7从CAN网络学习Autosar通信

从CAN网络学习Autosar通信 前言缩写词CAN通信在AUTOSAR架构中的传输上位机配置 第六章总结:学习了如何使用工具的自动配置功能,位我们生成系统描述中部分ecu的BSW模块配置,但是自动配置的功能虽然为我们提供了极大的便利,我们仍然…

css3的var()函数

css3的var()函数 变量要以两个连字符--(横杆)(减号)为开头 变量可以在:root{}中定义, :root可以在css中创建全局样式变量。通过 :root本身写的样式,相当于 html,但优先级比后者高。 在CSS3中,var()函数是一个用于插入CSS自定义属性&#xff…

Active Directory 的密码管理策略

员工使用的密码可以决定或破坏组织中的数据安全性,但是,知道员工通常不遵循良好的密码卫生习惯也就不足为奇了。从在本机工具(如 Windows Active Directory 组策略)中设置弱密码和通用密码到宽松的密码策略规则,有几个…

Eclipse - Text Editors (文本编辑器)

Eclipse - Text Editors [文本编辑器] References Window -> Preferences -> General -> Editors -> Text Editors Displayed tab witdth: 4 勾选 Insert spaces for tabs 勾选 Show line number References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…

学习总结19

# 奶牛的耳语 ## 题目描述 在你的养牛场&#xff0c;所有的奶牛都养在一排呈直线的牛栏中。一共有 n 头奶牛&#xff0c;其中第 i 头牛在直线上所处的位置可以用一个整数坐标 pi(0< pi < 10^8) 来表示。在无聊的日子里&#xff0c;奶牛们常常在自己的牛栏里与其它奶牛交…

【Azure 架构师学习笔记】- Azure Databricks (7) --Unity Catalog(UC) 基本概念和组件

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog 前言 在以前的Databricks中&#xff0c;主要由Workspace和集群、SQL Warehouse组成&#xff0c; 这两年Databricks公…

NLP_BERT与GPT争锋

文章目录 介绍小结 介绍 在开始训练GPT之前&#xff0c;我们先比较一下BERT和 GPT 这两种基于 Transformer 的预训练模型结构&#xff0c;找出它们的异同。 Transformer架构被提出后不久&#xff0c;一大批基于这个架构的预训练模型就如雨后春笋般地出现了。其中最重要、影响…

2024全年放假日历表及调休安排 用手机便签设置放假倒计时

对于绝大多数的上班族来说&#xff0c;春节长假已经结束&#xff0c;现在要回归到正常的工作和生活中。为了给生活增加一些“盼头”&#xff0c;很多小伙伴不约而同打开手机日历&#xff0c;查看下个法定节假日是什么时候。下面给大家具体讲一下2024全年放假日历表及调休安排&a…

EasySass: could not generate CSS file. See Output panel for details.微信小程序报错及解决

解决微信小程序导入vscode的easysass包报错 问题发现问题来源和解决制作不易&#xff0c;感谢三联&#xff0c;谢谢大家啦 问题发现 当我喜滋滋的在vscode中导入easysass包之后&#xff0c;又在微信小程序中添加vscode扩展&#xff0c;又去文件中改好了配置文件后却直接弹出了…

5G——物理层仿真

1.前置条件 2.仿真流程 1.填写搜索过程 解&#xff1a; 2.填写每一步细节 2.2.1 准备 解&#xff1a; &#xff08;1&#xff09;BCH &#xff08;2&#xff09;BCCH 解析&#xff1a;因为PBCH是物理广播信道&#xff0c;BCCH是用于广播系统控制信息的下行信道&#…

生成对抗网络----GAN

系列文章目录 文章目录 系列文章目录前言一、基本构成二、应用领域三、基本原理四、如何训练GAN 前言 一、基本构成 GAN (Generative Adversarial Network) : 通过两个神经网络&#xff0c;即生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#…

【Linux 内核源码分析】虚拟内存地址空间

在现代操作系统中&#xff0c;每个进程被分配了独享的虚拟内存地址空间。这个地址空间可以视为一维线性空间&#xff0c;由多个连续的内存页组成。初始时&#xff0c;操作系统会将整个虚拟地址空间分成几个不同的区域&#xff0c;每个区域用于特定的目的。以下是一个常见的布局…

【Linux取经路】文件系统之重定向的实现原理

文章目录 一、再来理解重定向1.1 输出重定向效果演示1.2 重定向的原理1.3 dup21.4 输入重定向效果演示1.5 输入重定向代码实现 二、再来理解标准输出和标准错误2.1 同时对标准输出和标准错误进行重定向2.2 将标准输出和标准错误重定向到同一个文件 三、再看一切皆文件四、结语 …

Camtasia 2023 v23.4.2.51146 Win功能强大的屏幕录制和视频编辑软件

Camtasia 2023.3.4.2是一款适用于各类用户的屏幕录制和视频编辑软件&#xff0c;特别适合需要制作教育、培训和营销视频的专业人士。它结合了易用性和多样的功能&#xff0c;使视频制作变得更加高效和专业。 软件安装 适用于 Win10.win11系统 1.直接安装软件&#xff0c;安装…

redis scan命令导致cpu飙升

一.背景 今天下午Redis的cpu占用突然异常升高&#xff0c;一度占用达到了90%&#xff0c;触发了钉钉告警&#xff0c;之后又回到正常水平&#xff0c;跟DBA沟通&#xff0c;他说主要是下面这个语句的问题 SCAN 0 MATCH fastUser:6136* COUNT 10000这个语句的执行时长很短&…

nginx 日志改为json格式

nginx 日志改为json格式 场景描述效果变更旧样式新样式 场景描述 正常使用nginx时&#xff0c;使用默认的日志输出格式&#xff0c;对于后续日志接入其他第三方日志收集、清洗环节&#xff0c;因分隔符问题可能不是很友好。 xxxx - - [19/Feb/2024:11:16:48 0800] "GET …

并发编程线程安全之同步锁Synchronized

一、原子性定义 原子性的本质是互斥访问&#xff0c;同一时刻只有一个线程对它进行访问操作 二、原子性问题的简述 public class AutomicDemo {int count 0;public static void main(String[] args) throws InterruptedException {AutomicDemo automicDemo new AutomicDem…

Idea启动Gradle报错: Please, re-import the Gradle project and try again

Idea启动Gradle报错&#xff1a;Warning:Unable to make the module: reading, related gradle configuration was not found. Please, re-import the Gradle project and try again. 解决办法&#xff1a; 开启步骤&#xff1a;View -> Tool Windows -> Gradle 点击refe…

解锁创意灵感,探索FlutterExampleApps项目的奥秘

解锁创意灵感&#xff0c;探索FlutterExampleApps项目的奥秘 项目简介 FlutterExampleApps项目是一个包含各种示例应用链接的仓库&#xff0c;旨在演示Flutter应用开发中的各种功能、特性和集成。 项目包含了以下几个部分&#xff0c;每个部分都涵盖了不同的内容和主题&…