当前位置: 首页 > wzjs >正文

建设通网站查询单位网站排名seo教程

建设通网站查询单位,网站排名seo教程,企业查询官网免费查询一下,精选商城app下载在前面的文章中有提到,在multi 前可以通过watch 来观察哪些key,被观察的这些key,会被redis服务器监控,涉及该key被修改时,则在exec 命令执行过程中会被识别出来,exec 就不会再执行命令。 源码分析 // 监控…

在前面的文章中有提到,在multi 前可以通过watch 来观察哪些key,被观察的这些key,会被redis服务器监控,涉及该key被修改时,则在exec 命令执行过程中会被识别出来,exec 就不会再执行命令。

源码分析

// 监控对应的key
void watchCommand(client *c) {int j;if (c->flags & CLIENT_MULTI) {addReplyError(c,"WATCH inside MULTI is not allowed");return;}/* No point in watching if the client is already dirty. */if (c->flags & CLIENT_DIRTY_CAS) {addReply(c,shared.ok);return;}for (j = 1; j < c->argc; j++)// 按指定的key进行监控watchForKey(c,c->argv[j]);addReply(c,shared.ok);
}
void watchForKey(client *c, robj *key) {list *clients = NULL;listIter li;listNode *ln;watchedKey *wk;/* Check if we are already watching for this key */// 当前已经监控的keylistRewind(c->watched_keys,&li);// 检查是否在监控列表while((ln = listNext(&li))) {wk = listNodeValue(ln);if (wk->db == c->db && equalStringObjects(key,wk->key))return; /* Key already watched */}/* This key is not already watched in this DB. Let's add it */// 获取监控的客户端列表// db->watched_keys是全局缓存的列表clients = dictFetchValue(c->db->watched_keys,key);if (!clients) {// 没有则创建clients = listCreate();dictAdd(c->db->watched_keys,key,clients);incrRefCount(key);}// 记录新的watchKey内容/* Add the new key to the list of keys watched by this client */wk = zmalloc(sizeof(*wk));wk->key = key; // 当前的keywk->client = c; // 当前的客户端wk->db = c->db; // 当前的数据库wk->expired = keyIsExpired(c->db, key); // 是否过期incrRefCount(key);listAddNodeTail(c->watched_keys,wk); // 加入客户端的列表listAddNodeTail(clients,wk); // 加入全局列表
}

watch 命令,做的事情其实也很简单,就是将当前客户端与key 进行关联,并把监控的key加入全局列表中,该全局列表。

当key有变更时,会调用signalModifiedKey进行通知。

void signalModifiedKey(client *c, redisDb *db, robj *key)
{// 监控的key进行刷新touchWatchedKey(db, key);trackingInvalidateKey(c, key, 1);
}
// 如果在multi之前有watch某些key,则该key的所以异动都会要执行该方法
// 并进行重置client的
void touchWatchedKey(redisDb *db, robj *key) {list *clients;listIter li;listNode *ln;if (dictSize(db->watched_keys) == 0) return;clients = dictFetchValue(db->watched_keys, key);if (!clients) return;/* Mark all the clients watching this key as CLIENT_DIRTY_CAS *//* Check if we are already watching for this key */listRewind(clients,&li);while((ln = listNext(&li))) {watchedKey *wk = listNodeValue(ln);client *c = wk->client;if (wk->expired) {/* The key was already expired when WATCH was called. */if (db == wk->db &&equalStringObjects(key, wk->key) &&dictFind(db->dict, key->ptr) == NULL){/* Already expired key is deleted, so logically no change. Clear* the flag. Deleted keys are not flagged as expired. */wk->expired = 0;goto skip_client;}break;}// 客户端增加标识,告知该客户端有被污染c->flags |= CLIENT_DIRTY_CAS;/* As the client is marked as dirty, there is no point in getting here* again in case that key (or others) are modified again (or keep the* memory overhead till EXEC). */// 移除所有的keyunwatchAllKeys(c);skip_client:continue;}
}

该方法会进行相应key的处理,并为持有该key的客户端,将其标识增加CLIENT_DIRTY_CAS,该标识会在exec命令中判断,如果有,说明watch的key已经被修改,不执行相关的命令。

http://www.dtcms.com/wzjs/305206.html

相关文章:

  • seo网站推广优化信息发布推广平台
  • 上海建设监理协会网站推推蛙seo顾问
  • 如何策划一个网站郑州网站推广公司
  • 建设高端网站公司的目的百度推广方法
  • 进入兔展网站做PPt杭州推广平台有哪些
  • 邢台县教育局五库建设网站百度爱采购平台登录
  • 做电影网站主机放哪比较好百度网站官网入口网址
  • 怎么做写真网站官网设计比较好看的网站
  • 制作网站一般使用的软件有哪些如何提高关键词搜索排名
  • 学做衣服上什么网站好百度seo刷排名工具
  • 怎么做网站frontpage百度seo多久能优化关键词
  • 北京网站制作培训如何在各种网站投放广告
  • 定手机网站建设网络推广运营
  • 重庆网站维护百度极速版下载安装
  • 成都龙华小学网站建设百度客户端下载
  • 做金融服务网站赚钱无需下载直接进入的网站的代码
  • 网站建设公司招聘网站关键词优化排名软件系统
  • 怎么用花生壳做网站网页制作图片
  • 沈阳网站建设技术公司排名杭州seo专员
  • 江都网站建设seo黑帽是什么
  • 电子商务网站建设与管理 pdf自己的app如何接广告
  • 石家庄网站建设招商自己建网站怎么弄
  • 穿着丝袜做会更爽网站抖音seo搜索引擎优化
  • 网页平面设计模板黑锋网seo
  • opencart做网站视频推广营销策划方案
  • 做时时彩网站赚钱软文街官方网站
  • wordpress的页面布局安卓排名优化
  • 佛山免费网站建站模板企业培训课程视频
  • 做网站一定要用ps吗google开户
  • 2345网址大全手机版厦门关键词排名seo