diff options
author | spinlock <wnzheng@gmail.com> | 2017-03-31 21:45:00 +0800 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2017-04-18 16:18:01 +0200 |
commit | 2299641417d404d70494e63d1a30bfec002613cd (patch) | |
tree | be7e2a4033687fd11a84d1bb124ad577a62f3eb7 | |
parent | d98ef35a119622a004c3d98bed7146435e1fb218 (diff) | |
download | redis-2299641417d404d70494e63d1a30bfec002613cd.tar.gz |
rdb: saving skiplist in reversed order to accelerate the deserialisation process
-rw-r--r-- | src/rdb.c | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -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"); } |