Redis事务简述
在Redis中,涉及到事务的操作有五个命令:MULTI、EXEC、DISCARD、WATCH、UNWATCH。其事务的使用步骤如下:
- 使用MULTI开启事务
- 提交命令到Redis队列中
- EXEC提交事务或DISCARD丢弃事务
其中WATCH是用来监视某个键的,在MULTI前进行使用,当监视的键值发生改变时,事务将提交失败,如果提交时与开启事务前的值相同,则提交成功。UNWATCH则用来取消监视。WATCH本质是实现乐观锁。
与关系型数据库事务的比较
相比大多数关系型数据库的事务,Redis与它们存在较大的差异。
Redis实现事务的原理是将在事务内部的所有命令先存在Redis命令队列中,待使用EXEC提交事务时才对执行队列中的所有命令;而关系型数据库不同,打开事务后执行sql语句也会得到结果。
Redis事务中不存在回滚,但是可以通过DISCARD来舍弃事务,这是因为Redis事务中的命令是存在于队列中未执行而等待EXEC后一次执行全部的。
Redis事务中提供的锁为乐观锁,使用不当反而造成性能问题。
Redis事务的ACID
- 原子性
Redis单个命令是原子性的,而对于事务,Redis事务中所有命令存在队列中,当执行EXEC时才将里面的命令一次性执行,这个过程不可被中断,使得事务内的所有命令都成为最小单位。原子性保证了事务要么全部成功运行,要么全部失败。以下有两个例子:
第一种情况事务全部执行失败,第二种执行了一半。
- 一致性
通过WATCH以及编程中正确的命令可实现一致性。
- 隔离性
由于Redis是单线程,在开启事务后,事务执行时不会被其他命令中断,所以事务之间不影响,所以满足隔离性。
- 持久性
这取决于Redis是否开启了数据持久。