笔者Redis事务相关文章链接:Redis 事务机制深入浅出
概述
Redis内置了WATCH
命令,使用WATCH
命令可以实现乐观锁的功能,在事务被EXEC
命令执行前,如果此前被WATCH
监视的某数据库键已经被修改过,则拒绝执行当前事务,返回空并重置客户端事务标识。在并发场景下易使用该命令,很容易理解,有并发的场景就有同步处理。
WATCH的使用
首先明确一点,底层实现中每个Redis客户端内都有一个用于标识事务状态的属性,在每一条命令送到服务器端时,在执行前都会先检查该属性,因为同一条命令在事务状态和非事务状态下应该有不同的处理方法。
WATCH的使用时机
WATCH
只能在事务未开启的状态下使用,命令执行前会先对客户端下的事务状态属性做检查,如果发现事务已经开启,则返回错误。此处也可以理解为不应允许WATCH
命令进入事务的命令队列。
演示如下;
127.0.0.1:6379> multi
OK
127.0.0.1:6379> watch a
(error) ERR WATCH inside MULTI is not allowed
使用WATCH监视数据库键
该命令语法如下watch key [key ...]
,语法中可以看出,Redis允许同时监视多个数据库键,当被监视任一数据库键被修改后,EXEC
后事务返回nil且不会实际执行。
正常使用演示如下,演示内将两个客户端的操作做串行化处理演示:
// 客户端1
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> set b 1
OK
127.0.0.1:6379> watch a
OK
127.0.0.1:6379> multi
OK
// 客户端2
127.0.0.1:6379> set a 2
OK
//客户端1
127.0.0.1:6379> incr b
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> mget a b
1) "2"
2) "1"