首页 > 数据库 >如何利用Redis进行事务处理呢?

如何利用Redis进行事务处理呢?

时间:2023-05-23 11:02:38浏览次数:45  
标签:事务 EXEC WATCH Redis 事务处理 利用 指令 操作 执行


一、概述

事务的本质,其实就是一组命令的集合。一个事务中的所有命令都会按照命令的顺序去执行,而中间不会被其他命令加塞

Redis提供了事务相关的5个指令,分别是:DISCARDEXECMULTIUNWATCHWATCH。如下图所示:

如何利用Redis进行事务处理呢?_Redis

下面我们就对Redis的事务操作一一的进行介绍。

二、MULTI(v1.2.0)

指令格式MULTI

操作逻辑:标记一个事务块的开始。随后的指令将在执行EXEC时作为一个原子执行。简而言之,我们可以使用MULTI来开启一个事务

操作演示

如何利用Redis进行事务处理呢?_Redis_02

操作解释: 我们发现,在事务中每次执行一条指令,就会返回QUEUED,表明指令已经存入了这个事务的执行队列中了。但是需要注意的一点是,只是放入了事务队列,但并没有去执行。那什么时候会执行呢?那就来看一下下个指令EXEC。

三、EXEC(v1.2.0)

指令格式EXEC

操作逻辑:执行事务中所有在排队等待的指令并将链接状态恢复到正常。当使用WATCH时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。简而言之,我们可以使用EXEC来提交一个事务

操作演示

如何利用Redis进行事务处理呢?_Redis_03

操作解释: 调用完EXEC之后,正确执行的都会返回OK,并且当我们再次查询account里面的金额的时候,也正确的返回了1100。这就说明,一个事务内的指令是按照顺序执行的。

四、DISCARD(v2.2.0)

指令格式DISCARD

操作逻辑:刷新一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。如果已使用WATCH,DISCARD将释放所有被WATCH的key

操作演示

如何利用Redis进行事务处理呢?_Redis_04

五、WATCH(v2.2.0)

指令格式WATCH

操作逻辑:标记所有指定的key被监视起来,在事务中有条件的执行。可以利用WATCH实现Redis的乐观锁

操作演示1

如何利用Redis进行事务处理呢?_Redis_05

操作演示2

如何利用Redis进行事务处理呢?_指令格式_06

操作解释:当执行了EXEC指令之后,watch就被隐式的执行了unwatch。如果需要再次监控,就需要再次调用WATCH指令。

六、UNWATCH(v2.2.0)

指令格式UNWATCH

操作逻辑:刷新一个事务中已被监视的所有key。如果执行EXEC或者DISCARD,则不需要手动执行UNWATCH 操作演示:(略)

七、事务中异常的处理

7.1> 命令语法错误

针对语法错误,会导致整个事务执行被中断

操作演示

如何利用Redis进行事务处理呢?_EXEC_07

7.2> 运行操作错误

针对执行中的异常,只会导致该条指令的执行失败,而不会影响事务中其他的指令

操作演示

如何利用Redis进行事务处理呢?_Redis_08

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:事务,EXEC,WATCH,Redis,事务处理,利用,指令,操作,执行
From: https://blog.51cto.com/u_15003301/6330123

相关文章

  • 聊聊如何利用spring插件来实现策略模式
    前言偶然的机会发现spring有个spring-plugin,官网对它的介绍是SpringPluginprovidesamorepragmaticapproachtoplugindevelopmentbyprovidingthecoreflexibilityofhavingpluginimplementationsextendingacoresystem'sfunctionalitybutofcoursenotdel......
  • redis,缓存雪崩,缓存穿透,缓存更新,缓存降级,缓存预热等问题
    一、缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成......
  • 【面试系列6】Redis
    redisredis是什么?内存数据库,一切数据操作都在内存中进行,所以速度很快,常被用来做缓存,消息队列,分布式锁。具有高效的数据结构,String、list、hash、set、zset,bitmaps、hyperloglog、geo、stream。redis还支持事务、持久化、多种集群方式、发布订阅模型、内存淘汰机制等等。re......
  • 利用Python爆破数据库备份文件
    某次测试过程中,发现PHP备份功能代码如下://根据时间生成备份文件名$file_name='D'.date('Ymd').'T'.date('His');$sql_file_name=$file_name.'.sql';那么形成的文件名格式如:D20180118T101433.sql,理论上是可以爆破的,于是写了一段Python脚本来尝试爆破。Py......
  • Linux Redis 做成系统服务
    概述系统:CentOS7.6Redis安装后启动方式:redis-server/xxx/xxx/redis.conf。若不指定配置文件,则redis-server不会读取任何配置文件,而是使用自身携带固定配置信息启动。若想将redis做成系统服务,则需在/etc/init.d目录下添加一个配置文件,文件中指定要启动的程序,如何可以使用系统服......
  • nginx+tomcat+pgsql+redis离线部署过程
    gccpcre-developenssl-develzlib-devel离线安装包:包含云盘地址.txt离线部署java+nginx+tomcat+pgsql+redis.zip:城通网盘:https://url86.ctfile.com/f/15666686-859830438-baa3a9?p=2048(访问密码:2048)阿里云网盘(城通速度慢可以选这个):https://www.aliyundrive......
  • Redis单机部署
    Redis单机部署1安装下载最新稳定版Redishttps://download.redis.io/redis-stable.tar.gz#安装wgetyuminstall-ywget#安装gcc环境yuminstallgcc-c++#获取安装包wgethttps://download.redis.io/redis-stable.tar.gztar-xvfredis-stable.tar.gzcdredis-stabl......
  • 利用 Django REST framework 编写 RESTful API
        自动生成符合RESTful规范的API支持OPTION、HEAD、POST、GET、PATCH、PUT、DELETE根据 Content-Type生成browserable的交互页面(自动为API生成非常友好的浏览器页面)非常细粒度的权限管理(可以细粒度到field级别)示意图安装$pipinstalldjangorestframew......
  • Android利用activity启动模式退出整个应用
    前面我们来先看一下目前网上提供的几种方案:1.退出单个activity1)、获取当前进程的id,杀死该进程。android.os.Process.killProcess(android.os.Process.myPid())2)、终止当前正在运行的Java虚拟机方法。System.exit(0); 3)、finish();4)、杀包方式。......
  • Redis 跳表
    参考小林:https://xiaolincoding.com/redis/data_struct/data_struct.html#%E8%B7%B3%E8%A1%A8cmu: https://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/skiplists.pdfwiki:https://en.wikipedia.org/wiki/Skip_list  跳表这种数据结构是由WilliamPugh(音译为威廉·普)发......