]> git.saurik.com Git - redis.git/commitdiff
merge antirez/smallkeys
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 4 Jun 2010 07:54:06 +0000 (09:54 +0200)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 4 Jun 2010 08:10:50 +0000 (10:10 +0200)
1  2 
Makefile
redis.c
staticsymbols.h

diff --cc Makefile
Simple merge
diff --cc redis.c
index 41bc9c9730eb4fb9738cde70c99bd1ec6dcd18e1,e67ba20d74a603cce9a30b2534df560f1369187e..16384d8723b8040189caa9b1090e1399f423a8ea
+++ b/redis.c
  /* Objects encoding. Some kind of objects like Strings and Hashes can be
   * internally represented in multiple ways. The 'encoding' field of the object
   * is set to one of this fields for this object. */
 -#define REDIS_ENCODING_RAW 0    /* Raw representation */
 -#define REDIS_ENCODING_INT 1    /* Encoded as integer */
 -#define REDIS_ENCODING_ZIPMAP 2 /* Encoded as zipmap */
 -#define REDIS_ENCODING_HT 3     /* Encoded as an hash table */
 +#define REDIS_ENCODING_RAW 0     /* Raw representation */
 +#define REDIS_ENCODING_INT 1     /* Encoded as integer */
 +#define REDIS_ENCODING_HT 2      /* Encoded as hash table */
 +#define REDIS_ENCODING_ZIPMAP 3  /* Encoded as zipmap */
 +#define REDIS_ENCODING_LIST 4    /* Encoded as zipmap */
 +#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
  
  static char* strencoding[] = {
--    "raw", "int", "zipmap", "hashtable"
++    "raw", "int", "hashtable", "zipmap", "list", "ziplist"
  };
  
  /* Object types only used for dumping to disk */
@@@ -5011,9 -4843,15 +5084,8 @@@ static void pushGenericCommand(redisCli
              addReply(c,shared.cone);
              return;
          }
 -        lobj = createListObject();
 -        list = lobj->ptr;
 -        if (where == REDIS_HEAD) {
 -            listAddNodeHead(list,c->argv[2]);
 -        } else {
 -            listAddNodeTail(list,c->argv[2]);
 -        }
 -        incrRefCount(c->argv[2]);
 +        lobj = createZiplistObject();
-         dictAdd(c->db->dict,c->argv[1],lobj);
-         incrRefCount(c->argv[1]);
+         dbAdd(c->db,c->argv[1],lobj);
      } else {
          if (lobj->type != REDIS_LIST) {
              addReply(c,shared.wrongtypeerr);
@@@ -5115,16 -4936,26 +5187,16 @@@ static void lsetCommand(redisClient *c
  }
  
  static void popGenericCommand(redisClient *c, int where) {
 -    robj *o;
 -    list *list;
 -    listNode *ln;
 +    robj *o = lookupKeyWriteOrReply(c,c->argv[1],shared.nullbulk);
 +    if (o == NULL || checkType(c,o,REDIS_LIST)) return;
  
 -    if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
 -        checkType(c,o,REDIS_LIST)) return;
 -    list = o->ptr;
 -
 -    if (where == REDIS_HEAD)
 -        ln = listFirst(list);
 -    else
 -        ln = listLast(list);
 -
 -    if (ln == NULL) {
 +    robj *value = lPop(o,where);
 +    if (value == NULL) {
          addReply(c,shared.nullbulk);
      } else {
 -        robj *ele = listNodeValue(ln);
 -        addReplyBulk(c,ele);
 -        listDelNode(list,ln);
 -        if (listLength(list) == 0) dbDelete(c->db,c->argv[1]);
 +        addReplyBulk(c,value);
 +        decrRefCount(value);
-         if (lLength(o) == 0) deleteKey(c->db,c->argv[1]);
++        if (lLength(o) == 0) dbDelete(c->db,c->argv[1]);
          server.dirty++;
      }
  }
@@@ -5207,23 -5040,15 +5279,23 @@@ static void ltrimCommand(redisClient *c
      }
  
      /* Remove list elements to perform the trim */
 -    for (j = 0; j < ltrim; j++) {
 -        ln = listFirst(list);
 -        listDelNode(list,ln);
 -    }
 -    for (j = 0; j < rtrim; j++) {
 -        ln = listLast(list);
 -        listDelNode(list,ln);
 +    if (o->encoding == REDIS_ENCODING_ZIPLIST) {
 +        o->ptr = ziplistDeleteRange(o->ptr,0,ltrim);
 +        o->ptr = ziplistDeleteRange(o->ptr,-rtrim,rtrim);
 +    } else if (o->encoding == REDIS_ENCODING_LIST) {
 +        list = o->ptr;
 +        for (j = 0; j < ltrim; j++) {
 +            ln = listFirst(list);
 +            listDelNode(list,ln);
 +        }
 +        for (j = 0; j < rtrim; j++) {
 +            ln = listLast(list);
 +            listDelNode(list,ln);
 +        }
 +    } else {
 +        redisPanic("Unknown list encoding");
      }
-     if (lLength(o) == 0) deleteKey(c->db,c->argv[1]);
 -    if (listLength(list) == 0) dbDelete(c->db,c->argv[1]);
++    if (lLength(o) == 0) dbDelete(c->db,c->argv[1]);
      server.dirty++;
      addReply(c,shared.ok);
  }
@@@ -5256,14 -5080,9 +5328,14 @@@ static void lremCommand(redisClient *c
              removed++;
              if (toremove && removed == toremove) break;
          }
 -        ln = next;
      }
 -    if (listLength(list) == 0) dbDelete(c->db,c->argv[1]);
 +    lReleaseIterator(li);
 +
 +    /* Clean up raw encoded object */
 +    if (subject->encoding == REDIS_ENCODING_ZIPLIST)
 +        decrRefCount(obj);
 +
-     if (lLength(subject) == 0) deleteKey(c->db,c->argv[1]);
++    if (lLength(subject) == 0) dbDelete(c->db,c->argv[1]);
      addReplySds(c,sdscatprintf(sdsempty(),":%d\r\n",removed));
  }
  
@@@ -5296,24 -5125,23 +5368,23 @@@ static void rpoplpushcommand(redisClien
  
          /* Add the element to the target list (unless it's directly
           * passed to some BLPOP-ing client */
 -        if (!handleClientsWaitingListPush(c,c->argv[2],ele)) {
 -            if (dobj == NULL) {
 -                /* Create the list if the key does not exist */
 -                dobj = createListObject();
 +        if (!handleClientsWaitingListPush(c,c->argv[2],value)) {
 +            /* Create the list if the key does not exist */
 +            if (!dobj) {
 +                dobj = createZiplistObject();
-                 dictAdd(c->db->dict,c->argv[2],dobj);
-                 incrRefCount(c->argv[2]);
+                 dbAdd(c->db,c->argv[2],dobj);
              }
 -            dstlist = dobj->ptr;
 -            listAddNodeHead(dstlist,ele);
 -            incrRefCount(ele);
 +            lPush(dobj,value,REDIS_HEAD);
          }
  
          /* Send the element to the client as reply as well */
 -        addReplyBulk(c,ele);
 +        addReplyBulk(c,value);
  
 -        /* Finally remove the element from the source list */
 -        listDelNode(srclist,ln);
 -        if (listLength(srclist) == 0) dbDelete(c->db,c->argv[1]);
 +        /* lPop returns an object with its refcount incremented */
 +        decrRefCount(value);
 +
 +        /* Delete the source list when it is empty */
-         if (lLength(sobj) == 0) deleteKey(c->db,c->argv[1]);
++        if (lLength(sobj) == 0) dbDelete(c->db,c->argv[1]);
          server.dirty++;
      }
  }
@@@ -7438,9 -7262,9 +7502,7 @@@ static void sortCommand(redisClient *c
                  }
              }
          }
-         if (dictReplace(c->db->dict,storekey,sobj)) {
-             incrRefCount(storekey);
-         }
 -        dbReplace(c->db,storekey,listObject);
++        dbReplace(c->db,storekey,sobj);
          /* Note: we add 1 because the DB is dirty anyway since even if the
           * SORT result is empty a new key is set and maybe the old content
           * replaced. */
@@@ -8838,41 -8723,18 +8953,41 @@@ static int rewriteAppendOnlyFile(char *
                  if (fwriteBulkObject(fp,o) == 0) goto werr;
              } else if (o->type == REDIS_LIST) {
                  /* Emit the RPUSHes needed to rebuild the list */
 -                list *list = o->ptr;
 -                listNode *ln;
 -                listIter li;
 +                char cmd[]="*3\r\n$5\r\nRPUSH\r\n";
 +                if (o->encoding == REDIS_ENCODING_ZIPLIST) {
 +                    unsigned char *zl = o->ptr;
 +                    unsigned char *p = ziplistIndex(zl,0);
 +                    unsigned char *vstr;
 +                    unsigned int vlen;
 +                    long long vlong;
 +
 +                    while(ziplistGet(p,&vstr,&vlen,&vlong)) {
 +                        if (fwrite(cmd,sizeof(cmd)-1,1,fp) == 0) goto werr;
-                         if (fwriteBulkObject(fp,key) == 0) goto werr;
++                        if (fwriteBulkObject(fp,&key) == 0) goto werr;
 +                        if (vstr) {
 +                            if (fwriteBulkString(fp,(char*)vstr,vlen) == 0)
 +                                goto werr;
 +                        } else {
 +                            if (fwriteBulkLongLong(fp,vlong) == 0)
 +                                goto werr;
 +                        }
 +                        p = ziplistNext(zl,p);
 +                    }
 +                } else if (o->encoding == REDIS_ENCODING_LIST) {
 +                    list *list = o->ptr;
 +                    listNode *ln;
 +                    listIter li;
  
 -                listRewind(list,&li);
 -                while((ln = listNext(&li))) {
 -                    char cmd[]="*3\r\n$5\r\nRPUSH\r\n";
 -                    robj *eleobj = listNodeValue(ln);
 +                    listRewind(list,&li);
 +                    while((ln = listNext(&li))) {
 +                        robj *eleobj = listNodeValue(ln);
  
 -                    if (fwrite(cmd,sizeof(cmd)-1,1,fp) == 0) goto werr;
 -                    if (fwriteBulkObject(fp,&key) == 0) goto werr;
 -                    if (fwriteBulkObject(fp,eleobj) == 0) goto werr;
 +                        if (fwrite(cmd,sizeof(cmd)-1,1,fp) == 0) goto werr;
-                         if (fwriteBulkObject(fp,key) == 0) goto werr;
++                        if (fwriteBulkObject(fp,&key) == 0) goto werr;
 +                        if (fwriteBulkObject(fp,eleobj) == 0) goto werr;
 +                    }
 +                } else {
 +                    redisPanic("Unknown list encoding");
                  }
              } else if (o->type == REDIS_SET) {
                  /* Emit the SADDs needed to rebuild the set */
                  /* If this key is already expired skip it */
                  if (expiretime < now) continue;
                  if (fwrite(cmd,sizeof(cmd)-1,1,fp) == 0) goto werr;
-                 if (fwriteBulkObject(fp,key) == 0) goto werr;
+                 if (fwriteBulkObject(fp,&key) == 0) goto werr;
 -                if (fwriteBulkLong(fp,expiretime) == 0) goto werr;
 +                if (fwriteBulkLongLong(fp,expiretime) == 0) goto werr;
              }
              if (swapped) decrRefCount(o);
          }
diff --cc staticsymbols.h
Simple merge