summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorspinlock <wnzheng@gmail.com>2017-03-31 21:45:00 +0800
committerantirez <antirez@gmail.com>2017-04-18 16:18:01 +0200
commit2299641417d404d70494e63d1a30bfec002613cd (patch)
treebe7e2a4033687fd11a84d1bb124ad577a62f3eb7
parentd98ef35a119622a004c3d98bed7146435e1fb218 (diff)
downloadredis-2299641417d404d70494e63d1a30bfec002613cd.tar.gz
rdb: saving skiplist in reversed order to accelerate the deserialisation process
-rw-r--r--src/rdb.c15
1 files 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");
}