为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题,本文介绍Redis事务,Lua在下一篇文章介绍
一、事务概述
简单地说,事务表示一组动作,要么全部执行,要么全部不执行。例如在社交网站上用户A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用户B的粉丝表中添加用户A,这两个行为要么全部执行,要么全部不执行,否则会出现数据不一致的情况
Redis只提供了四个命令管理事务:
-
MULTI:用来开启一个事务。开启一个事务之后,输入的命令不会被立即执行,而是进入事务队列中(入队),所以可以看见输入命令的结果显示为“QUEUED”
WATCH:是一个乐观锁。它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复
DISCARD:用于取消本次事务,放弃执行事务块内的所有命令。如果使用了WATCH,DISCARD将取消监视连接监视的所有键
EXEC:提交一个事务
所以Redis的事务比较简单,主要是因为它不支持事务中的回滚特性,同时无法实现命令之间的逻辑关系计算,当然也体现了Redis的“keep it simple”的特性