Redis事务

Redis事务处理

众所周知,事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。

在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTIEXECDISCARDWATCH。这四个指令构成了redis事务处理的基础。

1.MULTI用来组装一个事务;

2.EXEC用来执行一个事务;

3.DISCARD用来取消一个事务;

4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。

127.0.0.1:6379> multi                      //标记事务开始

OK

127.0.0.1:6379> incr user_id           //多条命令按顺序入队

QUEUED

127.0.0.1:6379> incr user_id

QUEUED

127.0.0.1:6379> incr user_id

QUEUED

127.0.0.1:6379> ping

QUEUED

127.0.0.1:6379> exec                      //执行

1) (integer) 1

2) (integer) 2

3) (integer) 3

4) PONG

在上面的例子中,我们看到了QUEUED的字样,这表示我们在用MULTI组装事务时,每一个命令都会进入到内存队列中缓存起来,如果出现QUEUED则表示我们这个命令成功插入了缓存队列,在将来执行EXEC时,这些被QUEUED的命令都会被组装成一个事务来执行。

对于事务的执行来说,如果redis开启了AOF持久化的话,那么一旦事务被成功执行,事务中的命令就会通过write命令一次性写到磁盘中去,如果在向磁盘中写的过程中恰好出现断电、硬件故障等问题,那么就可能出现只有部分命令进行了AOF持久化,这时AOF文件就会出现不完整的情况,这时,我们可以使用redis-check-aof工具来修复这一问题,这个工具会将AOF文件中不完整的信息移除,确保AOF文件完整可用。

 

WATCH本身的作用是“监视key是否被改动过”,而且支持同时监视多个key,只要还没真正触发事务,WATCH都会尽职尽责的监视,一旦发现某个key被修改了,在执行EXEC时就会返回nil,表示事务无法触发。

127.0.0.1:6379> set age 23

OK

127.0.0.1:6379> watch age         //开始监视age

OK

127.0.0.1:6379> set age 24         //EXEC之前,age的值被修改了

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379> set age 26

QUEUED

127.0.0.1:6379> get age

QUEUED

127.0.0.1:6379> exec             //触发EXEC

(nil)                                          //事务无法被执行

 

Redis并不支持回滚功能。

posted @ 2019-08-12 14:18  AllenHU320  阅读(138)  评论(0编辑  收藏  举报