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

济南建设工程信息网站创建网站需要什么技术

济南建设工程信息网站,创建网站需要什么技术,东莞长安网红打卡地,江西智能网站建设哪家好set 命令主要用来设置key的值&#xff0c;可以增加一些选项&#xff0c;如过期时间&#xff0c;nx/xx/ex/px等。 在上节中&#xff0c;说到setnx已经被废弃&#xff0c;建议使用set中指定nx参数&#xff0c; SET key value [NX] [XX] [KEEPTTL] [GET] [EX <seconds>] [P…

set 命令主要用来设置key的值,可以增加一些选项,如过期时间,nx/xx/ex/px等。

在上节中,说到setnx已经被废弃,建议使用set中指定nx参数,

SET key value [NX] [XX] [KEEPTTL] [GET] [EX <seconds>] [PX <milliseconds>]

[EXAT <seconds-timestamp>][PXAT <milliseconds-timestamp>]

  • EX seconds -- 按秒指定过期时间
  • PX milliseconds -- 按毫秒指定过期时间
  • EXAT timestamp-seconds -- 指定过期的具体时间点,单位秒。正整数
  • PXAT timestamp-milliseconds -- 指定过期的具体时间点,单位毫秒.正整数
  • NX -- 只有key不存在时,才设置值
  • XX -- 只有key存在时,才设置值
  • KEEPTTL -- 获取当前key的过期时间
  • GET -- 返回旧值或是当前key不存在,如果不是字符串类型,会返回异常。

来看下相应的源码,setcommand 内部也会调用setGenericCommand

void setCommand(client *c) {robj *expire = NULL;// 默认是秒为单位int unit = UNIT_SECONDS;int flags = OBJ_NO_FLAGS;// 解析命令的参数flag、过期时间的单位、过期时间if (parseExtendedStringArgumentsOrReply(c,&flags,&unit,&expire,COMMAND_SET) != C_OK) {return;}// key的值c->argv[2] = tryObjectEncoding(c->argv[2]);// 调用通用方法setGenericCommand(c,flags,c->argv[1],c->argv[2],expire,unit,NULL,NULL);
}

这里会调用parseExtendedStringArgumentsOrReply进行参数解析

int parseExtendedStringArgumentsOrReply(client *c, int *flags, int *unit, robj **expire, int command_type) {int j = command_type == COMMAND_GET ? 2 : 3;// 分析命令的参数for (; j < c->argc; j++) {char *opt = c->argv[j]->ptr;robj *next = (j == c->argc-1) ? NULL : c->argv[j+1];// 如果命令中包含选项nx,则增加OBJ_SET_NX标识,但要确认是非OBJ_SET_XX// 以下是处理相关的选项、并增加标识// 如ex\pxif ((opt[0] == 'n' || opt[0] == 'N') &&(opt[1] == 'x' || opt[1] == 'X') && opt[2] == '\0' &&!(*flags & OBJ_SET_XX) && (command_type == COMMAND_SET)){*flags |= OBJ_SET_NX;// 处理xx} else if ((opt[0] == 'x' || opt[0] == 'X') &&(opt[1] == 'x' || opt[1] == 'X') && opt[2] == '\0' &&!(*flags & OBJ_SET_NX) && (command_type == COMMAND_SET)){*flags |= OBJ_SET_XX;// 处理get} else if ((opt[0] == 'g' || opt[0] == 'G') &&(opt[1] == 'e' || opt[1] == 'E') &&(opt[2] == 't' || opt[2] == 'T') && opt[3] == '\0' &&(command_type == COMMAND_SET)){*flags |= OBJ_SET_GET;} else if (!strcasecmp(opt, "KEEPTTL") && !(*flags & OBJ_PERSIST) &&!(*flags & OBJ_EX) && !(*flags & OBJ_EXAT) &&!(*flags & OBJ_PX) && !(*flags & OBJ_PXAT) && (command_type == COMMAND_SET)){*flags |= OBJ_KEEPTTL;} else if (!strcasecmp(opt,"PERSIST") && (command_type == COMMAND_GET) &&!(*flags & OBJ_EX) && !(*flags & OBJ_EXAT) &&!(*flags & OBJ_PX) && !(*flags & OBJ_PXAT) &&!(*flags & OBJ_KEEPTTL)){*flags |= OBJ_PERSIST;} else if ((opt[0] == 'e' || opt[0] == 'E') &&(opt[1] == 'x' || opt[1] == 'X') && opt[2] == '\0' &&!(*flags & OBJ_KEEPTTL) && !(*flags & OBJ_PERSIST) &&!(*flags & OBJ_EXAT) && !(*flags & OBJ_PX) &&!(*flags & OBJ_PXAT) && next){*flags |= OBJ_EX;*expire = next;j++;} else if ((opt[0] == 'p' || opt[0] == 'P') &&(opt[1] == 'x' || opt[1] == 'X') && opt[2] == '\0' &&!(*flags & OBJ_KEEPTTL) && !(*flags & OBJ_PERSIST) &&!(*flags & OBJ_EX) && !(*flags & OBJ_EXAT) &&!(*flags & OBJ_PXAT) && next){*flags |= OBJ_PX;*unit = UNIT_MILLISECONDS;*expire = next;j++;} else if ((opt[0] == 'e' || opt[0] == 'E') &&(opt[1] == 'x' || opt[1] == 'X') &&(opt[2] == 'a' || opt[2] == 'A') &&(opt[3] == 't' || opt[3] == 'T') && opt[4] == '\0' &&!(*flags & OBJ_KEEPTTL) && !(*flags & OBJ_PERSIST) &&!(*flags & OBJ_EX) && !(*flags & OBJ_PX) &&!(*flags & OBJ_PXAT) && next){*flags |= OBJ_EXAT;*expire = next;j++;} else if ((opt[0] == 'p' || opt[0] == 'P') &&(opt[1] == 'x' || opt[1] == 'X') &&(opt[2] == 'a' || opt[2] == 'A') &&(opt[3] == 't' || opt[3] == 'T') && opt[4] == '\0' &&!(*flags & OBJ_KEEPTTL) && !(*flags & OBJ_PERSIST) &&!(*flags & OBJ_EX) && !(*flags & OBJ_EXAT) &&!(*flags & OBJ_PX) && next){*flags |= OBJ_PXAT;*unit = UNIT_MILLISECONDS;*expire = next;j++;} else {// 不支持的参数,直接返回异常addReplyErrorObject(c,shared.syntaxerr);return C_ERR;}}return C_OK;
}

该函数主要解析以下几个参数:标识、过期时间单位、过期时间。

void setGenericCommand(client *c, int flags, robj *key, robj *val, robj *expire, int unit, robj *ok_reply, robj *abort_reply) {long long milliseconds = 0; /* initialized to avoid any harmness warning */int found = 0;int setkey_flags = 0;// if (expire && getExpireMillisecondsOrReply(c, expire, flags, unit, &milliseconds) != C_OK) {return;}// set 之前获取 key对应的旧值if (flags & OBJ_SET_GET) {if (getGenericCommand(c) == C_ERR) return;}// 按key进行查询found = (lookupKeyWrite(c->db,key) != NULL);// 如果是SetNx命令,并且找到,则直接返回if ((flags & OBJ_SET_NX && found) ||(flags & OBJ_SET_XX && !found)){if (!(flags & OBJ_SET_GET)) {addReply(c, abort_reply ? abort_reply : shared.null[c->resp]);}return;}setkey_flags |= (flags & OBJ_KEEPTTL) ? SETKEY_KEEPTTL : 0;setkey_flags |= found ? SETKEY_ALREADY_EXIST : SETKEY_DOESNT_EXIST;// 设置key的值setKey(c,c->db,key,val,setkey_flags);server.dirty++;// 空间占用事件notifyKeyspaceEvent(NOTIFY_STRING,"set",key,c->db->id);// 如果有设置过期时间if (expire) {// 将key加入到过期列表setExpire(c,c->db,key,milliseconds);/* Propagate as SET Key Value PXAT millisecond-timestamp if there is* EX/PX/EXAT/PXAT flag. */robj *milliseconds_obj = createStringObjectFromLongLong(milliseconds);rewriteClientCommandVector(c, 5, shared.set, key, val, shared.pxat, milliseconds_obj);decrRefCount(milliseconds_obj);notifyKeyspaceEvent(NOTIFY_GENERIC,"expire",key,c->db->id);}if (!(flags & OBJ_SET_GET)) {addReply(c, ok_reply ? ok_reply : shared.ok);}/* Propagate without the GET argument (Isn't needed if we had expire since in that case we completely re-written the command argv) */if ((flags & OBJ_SET_GET) && !expire) {int argc = 0;int j;robj **argv = zmalloc((c->argc-1)*sizeof(robj*));for (j=0; j < c->argc; j++) {char *a = c->argv[j]->ptr;/* Skip GET which may be repeated multiple times. */if (j >= 3 &&(a[0] == 'g' || a[0] == 'G') &&(a[1] == 'e' || a[1] == 'E') &&(a[2] == 't' || a[2] == 'T') && a[3] == '\0')continue;argv[argc++] = c->argv[j];incrRefCount(c->argv[j]);}replaceClientCommandVector(c, argc, argv);}
}

setGenericCommand在前面的章节也有提到过,这里会处理的内容:过期时间的设置,key的value设置、内存的占用计算等。


文章转载自:

http://437jHkOp.dxtxk.cn
http://cz6nS56p.dxtxk.cn
http://gMNqRl4z.dxtxk.cn
http://cYrFvf78.dxtxk.cn
http://FjKeWnE1.dxtxk.cn
http://lHLPsXNB.dxtxk.cn
http://CDjnvody.dxtxk.cn
http://0iueauQr.dxtxk.cn
http://58Mztyw6.dxtxk.cn
http://JFI6yslS.dxtxk.cn
http://czsggP4B.dxtxk.cn
http://ns7x7ZhN.dxtxk.cn
http://arbW09A3.dxtxk.cn
http://Wf7rZHRC.dxtxk.cn
http://QknH5I6n.dxtxk.cn
http://alfBN01T.dxtxk.cn
http://mkvR3VfN.dxtxk.cn
http://JRLlhdXa.dxtxk.cn
http://XfNouF7F.dxtxk.cn
http://lRLjNEjI.dxtxk.cn
http://hr79NICE.dxtxk.cn
http://fr4waMFT.dxtxk.cn
http://IfVIizvd.dxtxk.cn
http://vXC7EWgU.dxtxk.cn
http://qYHfJbnq.dxtxk.cn
http://8uoJWcCw.dxtxk.cn
http://iVaKMliT.dxtxk.cn
http://4cK58ZiO.dxtxk.cn
http://o3vmgjYW.dxtxk.cn
http://m29Tc1oJ.dxtxk.cn
http://www.dtcms.com/wzjs/672510.html

相关文章:

  • 儿童设计网站赤峰网站开发
  • 计算机网站建设职业群设计公司有哪些部门
  • 房地产网站源码不花钱的免费永久云服务器平台
  • 高邮做网站工商执照查询官网
  • 电子商务网站策划书3000字商丘网络推广平台
  • 有什么免费的网站怎样入门网站开发
  • 提高网站流量的软文案例软件前端开发主要做什么
  • 做窗帘网站图片大全网站流量统计系统企业版
  • wp网站如何做文件的付费下载蚂蜂窝网站源码
  • 北京建设厅网站江门网站建设优化
  • 移动端网站怎么提交网站开发完整的解决方案
  • 百度基木鱼建站杭州建设网站的公司哪家好
  • 网站建设工具哪家好芜湖seo
  • wordpress邮件通知怎么做网站的优化
  • 东莞运营推广网站建设费用哈尔滨市工程建设监理有限公司
  • 泰安建站哪家好wordpress营销型大气
  • 简单网站建设优化推广网站建设感想
  • 免费看电视的网站专门做汽配的网站
  • 衡水网站公司农村电商平台
  • php教育学校网站源码西安外贸建站
  • 网站内链怎么删除wordpress文章编辑软件
  • 缙云建设局网站中国建设银行网站-个人客户
  • 注销网站备案申请表wordpress小说
  • 川畅咨询 网站建设推广链接点击器
  • 公众号电影网站怎么做wordpress网站翻译插件
  • 北京高端 网站建设青海网站建设
  • 外贸自助建站全球速卖通买家版
  • 网站开发毕业设计企业网站怎么做推广比较好
  • 原墨网站建设深圳互联网营销
  • 龙岗区住房和建设局网站打不开建筑企业管理咨询公司是做什么的