上次阅读事务的源码时,主要阅读了 multi、exec 和 discard 相关的命令,文章地址如下:Redis | 事务源码阅读,这次把上次没有看完的部分看接着看一下。
Redis 的 watch 数据结构
关于 watch 存在于几个数据结构当中,基本上在 redisServer、redisCient 和 redisDb 当中,它们大致的关系如下:
该示意图是一个大致的示意图,不太保证准确。其中,dict 用于保存监视的 key,而 dict 的 value 是一个 list 数据结构,list 中保存了监视指定 key 的客户端。
Redis 的 watch 命令
Redis 的 watch 命令用于监控指定的 key,它的代码在 multi.c 文件中,其代码如下。
/**
* watch命令
*/
void watchCommand(redisClient *c) {
int j;
if(c->flags & REDIS_MULTI) {
addReplyError(c,"WATCH inside MULTI is not allowed");
return;
}
for(j =1; j < c->argc; j++)
watchForKey(c,c->argv[j]);
addReply(c,shared.ok);
}
我们知道,watch 命令不能在 multi 命令后面执行。因此在 watchCommand 函数中首先判断是否执行过 multi 命令,如果执行了 multi 命令则返回错误。
然后调用 watchForKey 来把指定的 key 进行添加,watchForKey 的代码如下:
/**
* 监控指定的键