深入Redis:事务的理解
在MySql的事务中,有几个很重要的特性,原子性、一致性、持久性、隔离性。
相比于MySql,Redis的事务就没有这么复杂了,要简单很多。
- 原子性:官网的介绍中,Redis没有原子性。(因为Redis不存在回滚操作)
- 一致性:Redis没有约束,也没有回滚机制,事务执行过程中如果某个修改操作出现失败,就可能引起不一致的情况。所以Redis事务没有一致性。
- 持久性:Redis本身就是内存数据库,数据保存在内存中。所以Redis事务没有持久性。
- 隔离性:Redis是一个单线程模型的服务器程序,所有的请求/事务都是串行的。所以Redis事务没有隔离性。
这四大特性都没有,那Redis事务是来干嘛的呢?
Redis事务最主要的意义,就是为了“打包”,避免其他客户端的命令,插队到中间来~
Redis中实现事务,引入了队列,并且每个客户端都有一个队列。当开启事务的时候,此时客户端输入的命令,就会发送给服务器,并且进入这个队列中,而不是立即执行。当遇到了“执行事务”这个命令的时候才会把队列中这些任务都按照顺序来执行。
实现场景
当左侧客户端set key为111后,想要查询之前,右侧客户端把key更改为222,那么客户端1查询到的value就是222了。
事务操作
- 开启事务 MULTI
- 执行事务 EXEC
- 放弃当前事务 DISCARD
当使用MULTI命令后,之后的所有命令都会进入队列,直到EXEC命令后才会一次性全都执行完毕。如果没有执行EXEC命令,使用DISCARD命令后,会放弃当前队列中的命令。
WATCH
WATCH可以监控某个key是否在事务执行前发生了改变。
当左侧客户端set key 111后,开始watch这个key,再开启事务。此时右侧客户端set key 222,当watch检测到key被修改了,所以在exec后不会执行set key 333这个操作,exec的返回值为nil。
WATCH
命令的主要作用是实现乐观锁(optimistic locking)。它可以防止在事务执行期间,由于其他客户端的干扰导致数据不一致的问题。
总的来说,Redis的事务还是相当简单的,