什么是 Redis 事务

Redis 事务就是一个命令执行的队列,将一系列的预定义命令包装成一个整体,就是一个队列,当执行的时候,一次性按照添加顺序依次执行,中间不会被打断或者干扰

能干嘛?

一个队列中,一次性,顺序性,排他性的执行一系列命令

Redis 事务基本操作

开启事务:multi

设置事务的开始位置,这个指令开启后,后面所有的指令都会加入事务中

  1. 127.0.0.1:6379> multi
  2. OK

执行事务:exec

设置事务的结束位置,同时执行事务,与 multi 成对出现,成对使用

  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set k1 v1
  4. QUEUED
  5. 127.0.0.1:6379> set k2 v2
  6. QUEUED
  7. 127.0.0.1:6379> set k3 v3
  8. QUEUED
  9. 127.0.0.1:6379> exec
  10. 1) OK
  11. 2) OK
  12. 3) OK

取消事务:discard

终止当前事务,取消 multi 后,exec 前的所有指令

  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set k1 v1
  4. QUEUED
  5. 127.0.0.1:6379> set k2 v2
  6. QUEUED
  7. 127.0.0.1:6379> discard
  8. OK

注意:加入事务的命令并没有立马执行,只是加入到队列中,只有执行 exec 命令后才会真正的执行
**

加入和执行事务时出错会怎么办?

  • 加入事务,如果出现语法错误,事务则全部取消(全部连坐)
  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set k1 v1
  4. QUEUED
  5. 127.0.0.1:6379> set k2 v2
  6. QUEUED
  7. 127.0.0.1:6379> set k3
  8. (error) ERR wrong number of arguments for 'set' command
  9. 127.0.0.1:6379> set k3 v4
  10. QUEUED
  11. 127.0.0.1:6379> exec
  12. (error) EXECABORT Transaction discarded because of previous errors.
  • 执行事务报错,则成功的返回成功,失败的返回失败,不会影响报错后面的指令(冤有头,债有主)
  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set k1 v1
  4. QUEUED
  5. 127.0.0.1:6379> set k2 v2
  6. QUEUED
  7. 127.0.0.1:6379> set name zhangsan
  8. QUEUED
  9. 127.0.0.1:6379> incr name
  10. QUEUED
  11. 127.0.0.1:6379> set k3 v3
  12. QUEUED
  13. 127.0.0.1:6379> exec
  14. 1) OK
  15. 2) OK
  16. 3) OK
  17. 4) (error) ERR value is not an integer or out of range
  18. 5) OK

注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己实现
_

监控 KEY


watch

对 key 进行监控,必须结合 multi 使用,并且在 exec 前执行,如果此时,所监控的 key 发生了变化,那么在执行 exec 的时候,将终止事务执行

  1. 127.0.0.1:6379> watch k1
  2. OK
  3. 127.0.0.1:6379> multi
  4. OK
  5. 127.0.0.1:6379> set k1 888
  6. QUEUED
  7. 127.0.0.1:6379> exec
  8. (nil)

unwatch

取消对所有 key 的监控

  1. 127.0.0.1:6379> unwatch
  2. OK