Redis08-事务

140 阅读2分钟

事务

参考

01-redis安装:how2j.cn/k/redis/red…

02-redis学习:<Redis开发与运维>(获取本书PDF见文章末)

03-b站

1.介绍

Redis可以一次执行多个命令

  1. Redis会将命令进行序列化执行,依次按顺序执行。
  2. 执行期间,不会被其它命令插入,不允许加塞操作。

2.过程

  1. 开始事务(multi)
  2. 命令入队(queue)
  3. 执行事务(exec)

3.命令示例

(1)MULTI EXEC

需求:转账场景:A转账给B100元。

描述:

  1. 输入multi命令后开始,输入的命令依次被放在队列中,但是不会被执行。
  2. 直到输入exec命令后,队列里面的命令才会执行。

命令:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set A 200
QUEUED
127.0.0.1:6379> set B 20
QUEUED
127.0.0.1:6379> decrby A 100
QUEUED
127.0.0.1:6379> incrby B 100
QUEUED
127.0.0.1:6379> get A
QUEUED
127.0.0.1:6379> get B
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (integer) 100
4) (integer) 120
5) "100"
6) "120"

(2)DISCARD放弃队列运行

描述:

  1. 输入multi命令开始后,所以的命令都会依次进入队列中,但是不会被执行。
  2. 命令在队列过程中,可以执行命令discard命令来放弃队列运行。

命令:

127.0.0.1:6379> get A
"100"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby A 250
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get A
"100"

(3)事务错误处理(一)

描述:

如果在执行过程中,出现了错误,那么只有这个报错的命令不会被执行,其它命令会继续执行,不会回滚。

命令:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set F hello
QUEUED
127.0.0.1:6379> incr F
QUEUED
127.0.0.1:6379> set K aaa
QUEUED
127.0.0.1:6379> get K
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) "aaa"

(4)事务错误处理(二)

描述:

队列中出现了报告错误,则整个队列都会被取消。

命令:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 123
QUEUED
127.0.0.1:6379> setffff
(error) ERR unknown command 'setffff'
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

(5)事务中的WATCH

需求:张三在A账户在事务内进行操作,操作期间,王五对A账户进行操作。

命令:

watch:监视一个key或者多个key,事务执行之前这个key被其它命令所改动,那么事务将被打断。

4.应用场景

前提:

  1. 一组命令要么同时都执行,要么都不执行。
  2. 我们想要保证一组命令在执行过程中,不被其它命令插入。

场景:

  1. 秒杀活动。
  2. 转账活动。

链接:关注公众号Elevenkeep,回复redis即可获得链接。