List详解
[toc]
在Redis3.2之后,它采用QuickList来实现List。
Redis7之前,QuickList底层是ZipList,7之后底层是listpack。

PUSH操作底层都是由pushGenericCommand()函数来完成,只是参数不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
void pushGenericCommand(client *c, int where, int xx) { int j;
robj *lobj = lookupKeyWrite(c->db, c->argv[1]); if (checkType(c,lobj,OBJ_LIST)) return; if (!lobj) { if (xx) { addReply(c, shared.czero); return; }
lobj = createListListpackObject(); dbAdd(c->db,c->argv[1],lobj); }
listTypeTryConversionAppend(lobj,c->argv,2,c->argc-1,NULL,NULL); for (j = 2; j < c->argc; j++) { listTypePush(lobj,c->argv[j],where); server.dirty++; }
addReplyLongLong(c, listTypeLength(lobj)); char *event = (where == LIST_HEAD) ? "lpush" : "rpush"; signalModifiedKey(c,c->db,c->argv[1]); notifyKeyspaceEvent(NOTIFY_LIST,event,c->argv[1],c->db->id); }
|