众所周知,事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。
在聊redis事务处理之前,要先和大家介绍四个redis指令,即mutli、exec、discard、watch。这四个指令构成了redis事务处理的基础
1.multi用来组装一个事务;
2.exec用来执行一个事务;
3.discard用来取消一个事务;
4.watch用来见识一些key,一旦这些key在事务执行之前被改变,则取消事务的执行;
我们在用multi组装事务时,每一个命令都会进入内存中缓存起来,QUEUED表示缓存成功,在exec时,这些被QUEUED的命令都会被组装成一个事务来执行
对于这些事务的执行来说,如果redis开启了AOF持久化的话,那么一旦事务被成功执行,事务中的命令就会通过write命令一次性写入到磁盘中去,如果在向磁盘中写的过程恰好出现断电、硬件故障灯问题,那么就可能出现只有部分命令进行AOF持久化,这时AOF文件就会出现不完整的情况,这时,我们可以使用redis-check-aof工具来修复这一问题,这个工具会将AOF文件中不完整的信息移除,确保AOF文件完整可用
有关事务经常遇到两类错误
调用EXEC之前错误
调用EXEC之后错误
“调用EXEC之前错误”有可能是由于语法有误导致的,也可能是由于内存不足导致的,只要出现某个命令无法成功写入缓存队列的情况,redis都会进行记录,在客户端调用EXEC时,redis会拒绝执行这一事物
“调用EXEC之后错误”redis采用了完全不同的策略,即redis不会理睬这些错误,而是继续向下执行事务中的其他命令,这是因为,对于应用层面的错误,并不是redis自身需要考虑和处理的问题,所以一个事务中如果某一条命令执行失败,并不会影响下来的其他命令的执行,
“watch”这是一个很好用的指令,它可以帮我恩实现类似于乐观锁的效果,即CAS;watch本身的作用是“监视key是否被改动过”,而且支持同时监视多个key,只要还没真正触发事务watch都会尽职尽责的监视,一旦发现某个key被修改了,在执行exec时就会返回nil,表示事务无法触发
