Redis支持事务,允许一次执行多个命令,而且这些命令是连续执行的,不会在执行期间被其他客户端的操作中断。事务可以通过MULTI、EXEC、DISCARD和WATCH命令来完成。
MULTI命令开始一个事务,将客户端设置为事务模式。在事务模式下,客户端发送的命令不会立即执行,而是被添加到一个命令队列中。当客户端发送EXEC命令时,Redis服务器将按照先后顺序执行所有命令并返回执行结果。
举个例子,我们可以使用以下命令创建一个简单的事务:
> MULTI
OK
> SET foo 1
QUEUED
> INCR foo
QUEUED
> EXEC
1) OK
2) (integer) 2
在这个例子中,我们先使用MULTI命令开始一个事务,然后将SET和INCR命令添加到事务队列中。这两个命令返回的结果分别是QUEUED表示已经被添加到了事务队列中。最后,我们使用EXEC命令执行事务中的所有命令,并返回它们的结果。在这个例子中,我们将"foo"键的值分别设置为1和2,并返回了"OK"和2这两个结果。
如果事务中任何一个命令执行失败,那么所有的命令都会被取消,并且不会被执行。事务中的命令在执行期间不会被其他客户端的操作打断,因此可以确保事务执行的原子性。
WATCH命令可以用来实现乐观锁机制,它会监视一个或多个键,如果在执行事务之前这些键被其他客户端修改,则事务会被取消。当一个键被WATCH命令监视后,所有对该键的修改都会被暂时记录下来,直到事务执行完毕。
举个例子,我们可以使用以下命令创建一个带有乐观锁机制的事务:
> WATCH foo
OK
> MULTI
OK
> SET foo 1
QUEUED
> INCR foo
QUEUED
> EXEC
(nil)
在这个例子中,我们使用WATCH命令监视"foo"键,然后开始一个事务并将SET和INCR命令添加到事务队列中。在执行EXEC命令之前,我们使用另一个客户端修改了"foo"键的值。在这种情况下,当执行EXEC命令时,事务会被取消,返回结果为nil。