!!!注意跟Mysql中的事务的区分。
Redis事务的概念
Redis事务是一组命令的集合,这些命令会按照顺序执行,事务中的所有命令被序列化,然后按照顺序一次性执行,期间不会被其他命令插入。
Redis事务的工作原理
Redis事务通过以下四个步骤来执行:
- 开始事务:通过'MULTI'命令来标记事务的开始。
- 命令入队:将所有需要在事务中执行的命令依次入队,这些命令不会立即执行。
- 执行事务:通过'EXEC'命令来执行所有入队的命令。Redis会按顺序执行这些命令,并将结果一次性返回。
- 取消事务:可以在事务期间通过'DISCARD'命令取消事务,清空队列中的命令。
Redis事务的命令
MULTI
- 功能:开始一个事务。
- 用法:'MULTI'
- 说明:使用该命令后,所有后续名ing会被放入事务队列中,不会立即执行。
EXEC
- 功能:执行所有在事务期间入队的命令。
- 用法:'EXEC'
- 说明:当执行'EXEC'时,Redis会按顺序执行事务队列中的命令,并返回每个命令的执行结果。
DISCARD
- 功能:取消事务。
- 用法: 'DISCARD'
- 说明:清空事务队列中的所有命令,取消事务。
WATCH
- 功能:监视一个或多个键,在事务执行前,如果监视的键发生了变化,则事务会被中止。
- 用法:'WATCH key [key...]'
- 说明:使用'WATCH'命令可以防止事务执行期间数据发生变化,提供乐观锁机制。
UNWATCH
- 功能:取消对所有键的监视。
- 用法:'UNWATCH'
- 说明:清除所有'WATCH'命令设置的键监视。
Redis事务的特性
-
顺序性
Redis事务中的命令按照入队顺序依次执行,不会被其他客户端的命令打断。(事务是放到队列里执行的)
-
原子性
虽然Redis事务可以保证命令的顺序执行,但它不提供传统意义上的原子性。即事务中的某些命令可能会成功执行,而某些命令可能会失败,并不会回滚已执行的命令。
MULTI
SET user xiaoming
LPUSH user haha
SET user xiaohong
EXEC
==为什么Lua脚本可以解决Redis的原子性问题==
上面是一个事务,其中LPUSH这句话会报错,但是最后一行SET指令会成功执行,最后GET user的话会返回xiaohong
- 独立性
事务中的命令在执行时是独立的,彼此之间没有依赖关系。即使某个命令执行失败,其他命令仍然会继续执行。
- 无回滚
Redis事务不支持回滚机制。一旦'EXEC'执行,所有命令都会执行,无论其中某些命令是否失败。
- 乐观锁
通过'WATCH'命令,Redis提供了一种乐观锁机制。事务执行期间,如果监视的键发生了变化,事务会被中止,防止数据不一致。
Redis事务的使用场景
- 批量操作
需要对多个键进行批量操作,确保操作的顺序和原子性。例如,批量修改用户数据。
- 原子性操作
需要确保一组命令按顺序执行,并且在执行过程中不被其他操作打断。例如,转账操作时,需要确保扣款和存款操作按顺序执行。(但是只能说按照顺序执行,不能保证回滚)
- 复杂逻辑
需要在事务中实现一些复杂的业务逻辑,确保多个操作的一致性。例如,实现订单处理的逻辑。