跟我一起学Redis之Redis事务简单了解一下
前言关系数据库中的事务,小伙伴们应该是不陌生了,不管是在开发还是在面试过程中,总有两个问题逃不掉:
事务处理不好,数据就可能不准确,最终就会导致业务出问题;借此机会简单回顾一下事务特性及其隔离级别,就当是复习了; 事务特性(ACID)
事务隔离级别
正文转入正题,结合关系型数据库的事务来看看Redis中事务有什么不同; Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。 Redis事务的相关命令如下:
Redis事务和关系型数据库的事务不太一样,它不保证原子性,也没有隔离级别的概念。来,结合命令演示,实战说明一切: 没有隔离级别: 如上图所示,当事务开启时,事务期间的命令并没有执行,而是加入队列,只有执行EXEC命令时,事务中的命令才会按照顺序一一执行,从而事务间就不会导致数据脏读、不可重复读、幻读的问题,因此就没有隔离级别。 不保证原子性: 如上图所示,在通过EXEC执行事务时,其中命令执行失败不会影响到其他命令的执行,并没有保证同时成功和同时失败的原子操作,尽管这样,Redis事务中也没有提供回滚的支持,官方提供了两个理由: 大概的意思就是:
在事务命令入队过程中,发现相关命令逻辑使用错误,可以进行放弃该事务;如果使用错误的Redis命令,且没有放弃事务,最终也会导致事务整体执行失败,这也算是为原子性扳回一局,如下: 放弃事务 命令语法错误导致事务执行失败 使用WATCH实现乐观锁说到乐观锁,就和悲观锁一起简单说说对其的理解: 乐观锁:就是非常乐观,做什么事都往好处想; 对于数据库操作,就认为每次操作数据的时候都认为别的操作不会修改,所以不会加锁,而是通过一个类似于版本的字段来标识该数据是否修改过,在执行本次操作前先判断是否修改过,如果修改过就放弃本次操作重新再来; 悲观锁:就是非常悲观,做什么事都觉得不好;对于数据库操作,每次操作数据数据都会认为别的操作会修改当前数据,说以都要对其进行加锁,类似于表锁和行锁。 WATCH通过监视指定Redis Key,如果没有改变,就执行成功,如果发现对应值发生改变,事务就会执行失败,如下图; 那会一直监视指定的Key吗?,答案当然是不会的,以下三种方式可以取消监视:
Redis事务优缺点优点:
缺点:
注意
总结对于Redis事务,其实用的不是很多,大部分喜欢使用Lua脚本进行批量命令的执行,同时还能保证命令执行的原子性。 那为什么要说Redis事务呢? 在之前计划写这篇文章的时候,和一些朋友简单沟通过,大家的确用的不多,基本上都是用Lua脚本;但面试会时不时遇到过Redis事务的问题,最常见的是Redis中的事务和关系型数据库中的事务有什么区别,这是从面试角度出发有这篇文章; 其实Redis 2.6版本之前,还不支持Lua脚本时,Redis事务对于批量按序执行命令的场景也是很用的;就拿当下来说,如果一些业务需批量按序执行命令的,同样可以使用,并非一定要Lua脚本。这是从使用角度来说; 最后从学习角度来说,既然学Redis,就应该尽可能的了解的多一点。 下一篇说说持久化。 一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |