Redis 事务

是什么

官网:https://redis.io/docs/interact/transactions/

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

能干嘛

一个队列中,一次性、顺序性、排他性的执行一系列命令

Redis事务 VS 数据库事务

单独的隔离操作:Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的。

没有隔离级别的概念:因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了。

不保证原子性:Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力。

排它性:Redis会保证一个事务内的命令依次执行,而不会被其它命令插入。

怎么玩

常用命令

Case1:正常执行(MULTI + EXEC)

Case2:放弃事务(MULTI + DISCARD)

官网说明:

Case3:全体连坐

官网说明:

CaSe4:冤头债主

注意和传统数据库事务区别,不一定要么一起成功要么一起失败

补充:Redis不提供事务回滚的功能,开发者必须在事务执行出错后,自行恢复数据库状态。 

 官网说明:

Case5:watch监控

Redis使用Watch来提供乐观锁定,类似于CAS(Check-and-Set)

悲观锁:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。


乐观锁:乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁策略:提交版本必须   大于   记录当前版本才能执行更新。


CAS:

watch:

初始化k1和balance两个key,先监控再开启multi,保证两key变动在同一个事务内

有加塞篡改

watch命令是一种乐观锁的实现,Redis在修改的时候会检测数据是否被更改,如果更改了,则执行失败。

第一个窗口蓝色框第5步执行结果返回为空,也就是相当于是失败,笔记见最下面官网说明。

 官网说明:

unwatch:

小结:

  • 一旦执行了exec之前加的监控锁都会被取消掉了
  • 当客户端连接丢失的时候(比如退出链接),所有东西都会被取消监视

 

总结

开启:以 MULTI 开始一个事务

入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

执行:由EXEC命令触发事务

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

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

相关文章

springboot医院挂号小程序

医院挂号系统 springboot医院挂号系统小程序 java医院挂号小程序 技术: 基于springbootvue小程序医院挂号系统的设计与实现 运行环境: JAVA版本:JDK1.8 IDE类型:IDEA、Eclipse都可运行 数据库类型:MySql(…

1.计算机是如何工作的(下)

文章目录 4.编程语言(Program Language)4.1程序(Program)4.2早期编程4.3编程语言发展 5.操作系统(Operating System)5.1操作系统的定位5.2什么是进程/任务(Process/Task)5.3进程控制…

Vector - CAPL - 数据库和CAPL_02

DBLookup 动态读取数据库中的信息 //Transmitter 属性以及数据库属性只能通过 DBLookup 动态读取。 //返回数据库中存储的 DLC on message * {int myAttributeValue;myAttributeValue DBLookup(this).MyAttribute;write(this.Transmitter); // compiler errorwrite(DBLookup(…

押注数字人,百度、科大讯飞“短兵相接”

配图来自Canva可画 近两年,小雀斑、柳夜熙、AYAYI等大量网红数字人的相继出现,以及虚拟数字技术在《指环王》和《阿凡达》以及《刺杀小说家》等电影中的广泛应用,还有北京冬奥会期间数字人在手语解说、节目直播等众多场合亮相,使…

基于Spring Boot的高校实验室信息管理系统设计与实现(Java+spring boot+MySQL+VUE)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的高校实验室信息管理系统设计与实现(Javaspring bootMySQLVUE) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 后端:Java springboot…

GEE:基于MODIS土地覆盖类型“混交林”的净初级生产力(NPP)的区域统计

作者:CSDN @ _养乐多_ 本文将介绍如何使用Google Earth Engine(GEE)平台提取特定地区的净初级生产力(NPP)的统计信息,并在地图上可视化。通过加载MODIS数据集,并使用GEE提供的函数和方法,能够高效地计算特定地区的净初级生产力的平均值。 文章目录 一、代码详解二、代…

备忘录方法--Fibonacci数列 IV

描述 众所周知,Fibonacci数列是一个著名数列。它的定义是: 本题要求采用第四种方法:备忘录方法,即记忆化搜索。 具体做法是:用数组把曾经求出来的 Fibonacci 数列保存下来,以后要的时候直接取出来。 输入…

【RPC】—Protobuf编码原理

Protobuf编码原理 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ Spring专栏👉https://blog.csdn.net/weixin_53580595/category_12279588.html SpringMVC专…

ASL-QPSO|改进量子粒子群自适应算法及其实现(Matlab)

作者在前面的文章中介绍了量子粒子群算法,量子粒子群算法不但继承粒子群算法的优点,还有它自身计算模型更加简洁,控制参数更少等更加突出的优势,但依然存在着一定的局限性。 例如也会存在着早熟收敛的问题,随着迭代次数…

JAVA每日一练(1)

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? import java.util.Scanner;/*…

封装一个带el-form的,带el-table的,带分页的,带搜索查询的dialog组件,很使用的二次封装组件。

#封装dialog小案例 提示:这是我工作中封装的代码,很使用,需要的可以拿去, 在我们的代码中往往会出现点击按钮出现弹窗进行操作,那么我们就需要对dialog进行一个二次封装。 下边是大概的一个样式。 ##对组件进行二次…

【雕爷学编程】Arduino动手做(156)---OTTO两足舵机机器人

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…