robj *listTypePop(robj *subject, int where) { long long vlong; robj *value = NULL; int ql_where = where == LIST_HEAD ? QUICKLIST_HEAD : QUICKLIST_TAIL; if (subject->encoding == OBJ_ENCODING_QUICKLIST) { if (quicklistPopCustom(subject->ptr, ql_where, (unsigned char **)&value, NULL, &vlong, listPopSaver)) { if (!value) value = createStringObjectFromLongLong(vlong); } } else { serverPanic("Unknown list encoding"); } return value; }
//列表类型的从where弹出一个value,POP命令底层实现 robj *listTypePop(robj *subject, int where) { long long vlong; robj *value = NULL; //获得POP的位置,quicklist的头部或尾部 int ql_where = where == LIST_HEAD ? QUICKLIST_HEAD : QUICKLIST_TAIL; //对列表对象编码为quicklist类型操作 if (subject->encoding == OBJ_ENCODING_QUICKLIST) { //从ql_where位置POP出一个entry节点,保存在value或vlong中 if (quicklistPopCustom(subject->ptr, ql_where, (unsigned char **)&value, NULL, &vlong, listPopSaver)) { if (!value) //如果弹出的entry节点是整型的 //则根据整型值创建一个字符串对象 value = createStringObjectFromLongLong(vlong); } } else { serverPanic("Unknown list encoding"); } return value; //返回弹出entry节点的value值 }