Finished code for sorted set memory efficiency

This commit is contained in:
Pieter Noordhuis 2010-09-16 15:36:36 +02:00
parent 25bb8a4452
commit d433ebc681
2 changed files with 20 additions and 18 deletions

View File

@ -730,13 +730,14 @@ robj *rdbLoadObject(int type, FILE *fp) {
/* Load every single element of the list/set */ /* Load every single element of the list/set */
while(zsetlen--) { while(zsetlen--) {
robj *ele; robj *ele;
double *score = zmalloc(sizeof(double)); double score;
zskiplistNode *znode;
if ((ele = rdbLoadEncodedStringObject(fp)) == NULL) return NULL; if ((ele = rdbLoadEncodedStringObject(fp)) == NULL) return NULL;
ele = tryObjectEncoding(ele); ele = tryObjectEncoding(ele);
if (rdbLoadDoubleValue(fp,score) == -1) return NULL; if (rdbLoadDoubleValue(fp,&score) == -1) return NULL;
dictAdd(zs->dict,ele,score); znode = zslInsert(zs->zsl,score,ele);
zslInsert(zs->zsl,*score,ele); dictAdd(zs->dict,ele,&znode->score);
incrRefCount(ele); /* added to skiplist */ incrRefCount(ele); /* added to skiplist */
} }
} else if (type == REDIS_HASH) { } else if (type == REDIS_HASH) {

View File

@ -663,25 +663,23 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
* from small to large, all src[i > 0].dict are non-empty too */ * from small to large, all src[i > 0].dict are non-empty too */
di = dictGetIterator(src[0].dict); di = dictGetIterator(src[0].dict);
while((de = dictNext(di)) != NULL) { while((de = dictNext(di)) != NULL) {
double *score = zmalloc(sizeof(double)), value; double score, value;
*score = src[0].weight * zunionInterDictValue(de); score = src[0].weight * zunionInterDictValue(de);
for (j = 1; j < setnum; j++) { for (j = 1; j < setnum; j++) {
dictEntry *other = dictFind(src[j].dict,dictGetEntryKey(de)); dictEntry *other = dictFind(src[j].dict,dictGetEntryKey(de));
if (other) { if (other) {
value = src[j].weight * zunionInterDictValue(other); value = src[j].weight * zunionInterDictValue(other);
zunionInterAggregate(score, value, aggregate); zunionInterAggregate(&score,value,aggregate);
} else { } else {
break; break;
} }
} }
/* skip entry when not present in every source dict */ /* Only continue when present in every source dict. */
if (j != setnum) { if (j == setnum) {
zfree(score);
} else {
robj *o = dictGetEntryKey(de); robj *o = dictGetEntryKey(de);
znode = zslInsert(dstzset->zsl,*score,o); znode = zslInsert(dstzset->zsl,score,o);
incrRefCount(o); /* added to skiplist */ incrRefCount(o); /* added to skiplist */
dictAdd(dstzset->dict,o,&znode->score); dictAdd(dstzset->dict,o,&znode->score);
incrRefCount(o); /* added to dictionary */ incrRefCount(o); /* added to dictionary */
@ -695,11 +693,14 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
di = dictGetIterator(src[i].dict); di = dictGetIterator(src[i].dict);
while((de = dictNext(di)) != NULL) { while((de = dictNext(di)) != NULL) {
/* skip key when already processed */ double score, value;
if (dictFind(dstzset->dict,dictGetEntryKey(de)) != NULL) continue;
double *score = zmalloc(sizeof(double)), value; /* skip key when already processed */
*score = src[i].weight * zunionInterDictValue(de); if (dictFind(dstzset->dict,dictGetEntryKey(de)) != NULL)
continue;
/* initialize score */
score = src[i].weight * zunionInterDictValue(de);
/* because the zsets are sorted by size, its only possible /* because the zsets are sorted by size, its only possible
* for sets at larger indices to hold this entry */ * for sets at larger indices to hold this entry */
@ -707,12 +708,12 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
dictEntry *other = dictFind(src[j].dict,dictGetEntryKey(de)); dictEntry *other = dictFind(src[j].dict,dictGetEntryKey(de));
if (other) { if (other) {
value = src[j].weight * zunionInterDictValue(other); value = src[j].weight * zunionInterDictValue(other);
zunionInterAggregate(score, value, aggregate); zunionInterAggregate(&score,value,aggregate);
} }
} }
robj *o = dictGetEntryKey(de); robj *o = dictGetEntryKey(de);
znode = zslInsert(dstzset->zsl,*score,o); znode = zslInsert(dstzset->zsl,score,o);
incrRefCount(o); /* added to skiplist */ incrRefCount(o); /* added to skiplist */
dictAdd(dstzset->dict,o,&znode->score); dictAdd(dstzset->dict,o,&znode->score);
incrRefCount(o); /* added to dictionary */ incrRefCount(o); /* added to dictionary */