redis 作为非关系型数据库,同样具有简单的“伪事务”处理能力。

众所周知以 mysql 为代表的关系型数据库多数可以支持事务处理,redis 数据库通过底层的命令队列同样可以实现类似于队列的功能。一般情况下,redis 服务端接收到客户端发来的命令后会立即执行并返回结果,但是当连接端发送 multi 命令时,redis 会首先将此后客户端发来的命令存入一个队列中,等候客户端发送 exec 命令之后,redis 服务端开始按队列顺序依次执行其中的命令,并将所有命令的执行结果打包一起返回到客户端。例如:

redis > multi
OK
redis > set num 1
QUEQED
redis > incr numb
QUEUED
redis > exec
1) OK
2) (integer) 2

可以发现再所有命令执行完成以后服务端会一次性将执行结果打包发送到客户端,而不是逐次执行并返回。如果再 exec 执行之前需要取消“事务”(删除队列),可以调用 discard 命令:

redis > multi
OK
redis > set num 1
QUEQED
redis > incr numb
QUEUED
redis > discard
OK

但是值得注意的是,redis 虽然可以通过命令队列的方式模拟实现关系型数据库事务的功能,但是 redis 并不能执行回滚操作,也就是说,redis 并不保证命令队列中的部分命令执行失败后回滚整个操作,这一点从根本上决定了 redis “事务”与关系型数据库事务的不同。