Redis事务
什么是Redis事务
Redis 事务是一组命令的集合,将多个命令进行打包,然后这些命令会被顺序地添加到队列中,并按照添加的顺序依次执行。
Redis事务三阶段:
- 事务开始:以MULTI开始一个事务
- 命令入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
- 执行事务:由EXEC命令触发事务
Redis对事务是部分支持的,如果是在入队时报错(例如指令语法错误),那么都不会执行;在执行时报错(例如指令执行数据结构错误),那么成功的就会成功执行。
Redis事务三个重要保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
Redis事务三大特性
- 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行。
- 不保证原子性:Redis事务中如果有一条命令执行失败,其后的命令仍然会被执行,不会回滚
乐观锁
-
WATCH指令:
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。在执行MULTI之前,先执行WATCH进行监视key。WATCH key [key ……]
-
UNWATCH指令:
取消WATCH命令对所有key的监视
如果在执行WATCH命令之后,EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了。
实例
以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"