Reids 事务,命令,场景

2024-06-05 04:04
文章标签 命令 场景 事务 reids

本文主要是介绍Reids 事务,命令,场景,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

性质

原子性:事务中的所有命令要么全部执行,要么全部不执行。相比于 MySQL 中的原子性,Redis的还是稍微比较吝啬的。MySQL 中的是事务所有命令要么全部成功,要么全部不执行。在MySQL中,如果不是全部执行成功则会进行回滚操作。Redis中是没有的。

不具备一致性:redis 中没有约束,也没有回滚机制,事务执行过程中的某个修改操作出现失败,就可能引发不一致的情况。

不具备持久性:redis本身就是内存数据库,数据是存在内存中的。虽然 redis 有持久化机制。但是这个持久化机制和事务是没有关系的。

不涉及隔离性:reids为一个单线程模型的服务器程序。所有的请求/事务都是"串化"执行的。

开启事务的时候,此时客户端输入的命令,就会发送给服务器并且进入到一个队列中(不是立刻执行)。当收到执行事务的时候,此时主线程就会把队列中的任务按照顺序执行。


命令

开启事务

MULTI

执行事务

EXEC

 放弃当前事务

DISCARD

监控 key 是否在执行事务前发生改变

WATCH

watch 的实现类似与乐观锁(在加锁之前有一个预期,预期锁冲突的概率比较低,悲观锁反之)

假设有一个 key 111。第一个客户端进行 watch key (会给 key 分配一个版本号,假设为 1) ,然后 multi(开启事务)进行 set key 222。当其他的客户端对这个 key 进行修改,这个版本号就会变大(假设变成了2)。然后在第一个客户端进行 exec 执行命令的时候就会进行判定,判断这个版本号是否和原来分配的一样,一样的话说明当前这个 key 在这个事务执行的过程中,没有别的客户端进行修改,于是就进行设置 key 为 222。反正,失败,返回 nil。


场景

超卖:防止超量卖出,redis 为单线程,通过事务处理多个客户端进行买东西。

第一个客户端

开启事务
get count
if count > 0decr count
执行事务

第二个客户端

开启事务
get count
if count > 0decr count
执行事务

redis 服务器在队列中收到这些请求,当到执行事务的步骤时,才开始执行第一个事务(第二个排队),当到第二个事务时候拿到的 count 已经是 -- 后的了

这篇关于Reids 事务,命令,场景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032016

相关文章

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情