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

做网站销售怎么做优化大师tv版

做网站销售怎么做,优化大师tv版,小网站大全,知名的wordpress博客此篇为对redis五大数据类型中list的分析,希望能有所帮助 List API listTypePush函数 void listTypePush(robj *subject, robj *value, int where) {/* 检查编码类型是否为 quicklist (快速列表) */if (subject->encoding OBJ_ENCODING_QUICKLIST) {/* 根据参数…

此篇为对redis五大数据类型中list的分析,希望能有所帮助

 List API

listTypePush函数

void listTypePush(robj *subject, robj *value, int where) {/* 检查编码类型是否为 quicklist (快速列表) */if (subject->encoding == OBJ_ENCODING_QUICKLIST) {/* 根据参数 where 选择插入位置,由 pos 保存插入位置信息 */int pos = (where == LIST_HEAD) ? QUICKLIST_HEAD : QUICKLIST_TAIL;/* value 为整数编码 */if (value->encoding == OBJ_ENCODING_INT) {/* 将 value 先转换为字符串 */char buf[32];ll2string(buf, 32, (long)value->ptr);/* 将元素插入列表 */quicklistPush(subject->ptr, buf, strlen(buf), pos);/* value 为字符串编码 */} else {quicklistPush(subject->ptr, value->ptr, sdslen(value->ptr), pos);}} else {serverPanic("Unknown list encoding");}
}

分析:

该函数将一个元素插入到指定的列表对象 'subject', 插入位置由 'where' 决定是在列表头部还是尾部插入,调用者不需要自己来增加 'value' 的 refcount,该函数会负责处理。

作用:

实现命令函数pushGenericCommand中会用到

 /* 读取输入的元素,并向列表插入元素 */for (j = 2; j < c->argc; j++) {listTypePush(lobj,c->argv[j],where);/* 脏数据 + 1,即缓存中未保存到本地的数据 */server.dirty++;}

实现 lmove 命令中向目的列表(destination)插入元素中会用到

 /* 向列表中插入元素 */listTypePush(dstobj,value,where);

listPopSaver函数(用于给列表弹出的元素创建副本的函数)

void *listPopSaver(unsigned char *data, size_t sz) {return createStringObject((char*)data,sz);
}

示例:

给quicklistPopCustom传参用到

/* 从列表中弹出元素 */if (quicklistPopCustom(subject->ptr, ql_where, (unsigned char **)&value,NULL, &vlong, listPopSaver)) 

listTypePop函数(弹出列表元素的通用实现函数)

robj *listTypePop(robj *subject, int where) {long long vlong;robj *value = NULL;/* 根据参数 where 选择插入位置,由 ql_where 保存插入位置信息 */int ql_where = where == LIST_HEAD ? QUICKLIST_HEAD : QUICKLIST_TAIL;/* 检查编码类型是否为 quicklist (快速列表) */if (subject->encoding == OBJ_ENCODING_QUICKLIST) {/* 从列表中弹出元素 */if (quicklistPopCustom(subject->ptr, ql_where, (unsigned char **)&value,NULL, &vlong, listPopSaver)) {/* 如果 value 为 NULL ,则弹出元素被保存在 vlong 中(若不为 NULL 则说明保存在 value 中)* 则用 vlong 创建一个字符串对象并让 value 对其引用 */if (!value)value = createStringObjectFromLongLong(vlong);}} else {serverPanic("Unknown list encoding");}return value;
}

示例:

 popGenericCommand函数,弹出一个元素

/* 弹出一个元素,这是 pop 的原始操作,会向客户端回复一个字符串 */value = listTypePop(o,where);

listTypeLength函数(获取列表长度(元素总数))

unsigned long listTypeLength(const robj *subject) {if (subject->encoding == OBJ_ENCODING_QUICKLIST) {return quicklistCount(subject->ptr);} else {serverPanic("Unknown list encoding");}
}

listTypeInitIterator函数(在指定的索引处初始化一个列表迭代器)

listTypeIterator *listTypeInitIterator(robj *subject, long index,unsigned char direction) {/* 给列表迭代器分配内存空间 */listTypeIterator *li = zmalloc(sizeof(listTypeIterator));/* 初始化列表迭代器 */li->subject = subject;li->encoding = subject->encoding;li->direction = direction;li->iter = NULL;/* LIST_HEAD means start at TAIL and move *towards* head.* LIST_TAIL means start at HEAD and move *towards* tail. *//* LIST_HEAD 意味着从列表尾部开始,并向头部移动。* LIST_TAIL 表示从列表头部开始,并向尾部移动 */int iter_direction =direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD;/* 检查编码类型是否为 quicklist (快速列表) */if (li->encoding == OBJ_ENCODING_QUICKLIST) {/* 初始化一个 quicklist 节点的迭代器,并且该迭代器指向列表的第 index 个元素,* 虽然用词是”指向“但是迭代器并不是一个指针,而是个结构体,它记录的元素信息是列表第 index 个元素 */li->iter = quicklistGetIteratorAtIdx(li->subject->ptr,iter_direction, index);} else {serverPanic("Unknown list encoding");}return li;
}

用处:

linsertCommand函数中用于遍历查找,初始化迭代器;在addListRangeReply函数中初始化范围起点位置的迭代器 

listTypeSetIteratorDirection函数(设置迭代器的方向 )

void listTypeSetIteratorDirection(listTypeIterator *li, unsigned char direction) {li->direction = direction;int dir = direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD;quicklistSetDirection(li->iter, dir);
}

listTypeReleaseIterator函数(释放迭代器)

void listTypeReleaseIterator(listTypeIterator *li) {quicklistReleaseIterator(li->iter);zfree(li);//redis定义的一个函数,在free函数的基础上有改变
}

基本上跟在listTypeInitIterator函数后面,释放迭代器

listTypeNext函数

int listTypeNext(listTypeIterator *li, listTypeEntry *entry) {/* Protect from converting when iterating *//* 保护迭代时编码不被转换,则需要迭代器记录的编码类型和迭代器指向的列表对象编码一致 */serverAssert(li->subject->encoding == li->encoding);/* 将参数 li 赋值给参数 entry 的迭代器成员 */entry->li = li;/* 检查编码类型是否为 quicklist (快速列表) */if (li->encoding == OBJ_ENCODING_QUICKLIST) {/* 调用 quicklistNext 函数获取下一个元素,* 元素 (quicklistEntry) 保存在 entry->entry 中,并推进迭代器位置* 如果 下一个元素存在,该函数返回1,否则返回0 */return quicklistNext(li->iter, &entry->entry);} else {serverPanic("Unknown list encoding");}return 0;
}

分析:

 获取迭代器指向元素的下一个元素,并推进迭代器的位置(推进方向由迭代器成员 direction 决定)。 如果 entry(下一个元素) 存在,返回1,否则返回0 

用处:

linsertCommand函数中用于遍历查找,在addListRangeReply函数中设置迭代器的范围起点位置

总结:

本篇分析了listpush,popsaver,poplength函数,对列表弹出元素和计算列表长度的功能进行分析,同时还分析了关于迭代器初始化,设置方向,释放和获取迭代器下一个元素的函数,对迭代器的功能进行分析。

http://www.yayakq.cn/news/707106/

相关文章:

  • 网站建设怎样宣传比较好给自己做的网站换首页
  • 信息发布型网站建设的特点建盏名家罗建明简介
  • 外贸网站做流量需要登陆的网站如何做爬虫
  • wordpress如何安装模板常州淄博网站优化
  • 做外贸在什么网站做网站开发诺亚科技
  • 地方网站做的好的做管理信息的网站
  • flash网站项目背景前端seo优化方案
  • 网站建设方案计划书人员规划访问外国网站速度慢
  • 手机网站开发 和 网页有什么做数学题的网站
  • 怎么创网站wordpress百度影音
  • 做电脑网站宽度河北省建设工程招标投标信息网
  • 网站开发行业竞争大吗自己怎么做云购网站吗
  • 做鲜榨果汁店网站黄冈网站开发
  • 哪有做婚介网站的天水嘉通建设集团网站
  • 河北网站建设备案如何做网站开屏
  • 网站结构物理新泰市建设局网站
  • 佛山网站建设网站制作公司同ip多域名做同行业网站
  • wordpress双语网站深圳市长城建设有限公司网站
  • 怎么进行网站开发定州网站建设电话
  • 如何修改管理网站iss怎么做网站
  • 代做广联达 的网站商务网站的可行性分析包括
  • 电脑网站设计制作专做奢侈品的网站
  • 展览展会网站建设品牌网站建设专家
  • 宜宾网站建设08keji鞭打wordpress
  • 手机网站制作价格wordpress crossapple
  • 网站传送门怎么做外贸推广如何做
  • 网站备案号怎么做超链接如何更换网站模板
  • 凡科建站代理商深圳vi设计公司排行
  • 在线做维恩图的生物信息学网站太原网站制作多少钱
  • 高邮城乡建设网站深圳企业官网设计公司