From 2299641417d404d70494e63d1a30bfec002613cd Mon Sep 17 00:00:00 2001 From: spinlock Date: Fri, 31 Mar 2017 21:45:00 +0800 Subject: rdb: saving skiplist in reversed order to accelerate the deserialisation process --- src/rdb.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/rdb.c b/src/rdb.c index 2689b172d..c6a88081b 100644 --- a/src/rdb.c +++ b/src/rdb.c @@ -704,23 +704,24 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) { nwritten += n; } else if (o->encoding == OBJ_ENCODING_SKIPLIST) { zset *zs = o->ptr; - dictIterator *di = dictGetIterator(zs->dict); - dictEntry *de; + zskiplist *zsl = zs->zsl; - if ((n = rdbSaveLen(rdb,dictSize(zs->dict))) == -1) return -1; + if ((n = rdbSaveLen(rdb,zsl->length)) == -1) return -1; nwritten += n; - while((de = dictNext(di)) != NULL) { - sds ele = dictGetKey(de); - double *score = dictGetVal(de); + zskiplistNode *zn = zsl->tail; + while (zn != NULL) { + sds ele = zn->ele; + double *score = &zn->score; if ((n = rdbSaveRawString(rdb,(unsigned char*)ele,sdslen(ele))) == -1) return -1; nwritten += n; if ((n = rdbSaveBinaryDoubleValue(rdb,*score)) == -1) return -1; nwritten += n; + + zn = zn->backward; } - dictReleaseIterator(di); } else { serverPanic("Unknown sorted set encoding"); } -- cgit v1.2.1