Redis事务(未完待续)

78 阅读3分钟

!!!注意跟Mysql中的事务的区分。

Redis事务的概念

Redis事务是一组命令的集合,这些命令会按照顺序执行,事务中的所有命令被序列化,然后按照顺序一次性执行,期间不会被其他命令插入。

Redis事务的工作原理

Redis事务通过以下四个步骤来执行:

  1. 开始事务:通过'MULTI'命令来标记事务的开始。
  2. 命令入队:将所有需要在事务中执行的命令依次入队,这些命令不会立即执行。
  3. 执行事务:通过'EXEC'命令来执行所有入队的命令。Redis会按顺序执行这些命令,并将结果一次性返回。
  4. 取消事务:可以在事务期间通过'DISCARD'命令取消事务,清空队列中的命令。

Redis事务的命令

MULTI

  • 功能:开始一个事务。
  • 用法:'MULTI'
  • 说明:使用该命令后,所有后续名ing会被放入事务队列中,不会立即执行。

EXEC

  • 功能:执行所有在事务期间入队的命令。
  • 用法:'EXEC'
  • 说明:当执行'EXEC'时,Redis会按顺序执行事务队列中的命令,并返回每个命令的执行结果。

DISCARD

  • 功能:取消事务。
  • 用法: 'DISCARD'
  • 说明:清空事务队列中的所有命令,取消事务。

WATCH

  • 功能:监视一个或多个键,在事务执行前,如果监视的键发生了变化,则事务会被中止。
  • 用法:'WATCH key [key...]'
  • 说明:使用'WATCH'命令可以防止事务执行期间数据发生变化,提供乐观锁机制。

UNWATCH

  • 功能:取消对所有键的监视。
  • 用法:'UNWATCH'
  • 说明:清除所有'WATCH'命令设置的键监视。

Redis事务的特性

  1. 顺序性

    Redis事务中的命令按照入队顺序依次执行,不会被其他客户端的命令打断。(事务是放到队列里执行的)

  2. 原子性

虽然Redis事务可以保证命令的顺序执行,但它不提供传统意义上的原子性。即事务中的某些命令可能会成功执行,而某些命令可能会失败,并不会回滚已执行的命令。

MULTI
SET user xiaoming
LPUSH user haha
SET user xiaohong
EXEC

==为什么Lua脚本可以解决Redis的原子性问题==

上面是一个事务,其中LPUSH这句话会报错,但是最后一行SET指令会成功执行,最后GET user的话会返回xiaohong

  1. 独立性

事务中的命令在执行时是独立的,彼此之间没有依赖关系。即使某个命令执行失败,其他命令仍然会继续执行。

  1. 无回滚

Redis事务不支持回滚机制。一旦'EXEC'执行,所有命令都会执行,无论其中某些命令是否失败。

  1. 乐观锁

通过'WATCH'命令,Redis提供了一种乐观锁机制。事务执行期间,如果监视的键发生了变化,事务会被中止,防止数据不一致。

Redis事务的使用场景

  1. 批量操作

需要对多个键进行批量操作,确保操作的顺序和原子性。例如,批量修改用户数据。

  1. 原子性操作

需要确保一组命令按顺序执行,并且在执行过程中不被其他操作打断。例如,转账操作时,需要确保扣款和存款操作按顺序执行。(但是只能说按照顺序执行,不能保证回滚)

  1. 复杂逻辑

需要在事务中实现一些复杂的业务逻辑,确保多个操作的一致性。例如,实现订单处理的逻辑。