专栏名称: 爬蜥
目录
相关文章推荐
51好读  ›  专栏  ›  爬蜥

从源码看redis的'set'结构

爬蜥  · 掘金  ·  · 2020-03-14 12:08

正文

阅读 38

从源码看redis的'set'结构

sadd 命令用来往 set 结构中存入数据

> sadd a 1
(integer) 1
复制代码

smembers 可以查到存储的内容

> smembers a
1) "1"
复制代码

sadd命令执行追踪

sadd 的执行入口在 saddCommand ,如果key不存在那么第一件事情就是确认底层的存储结构

 Code.SLICE.source("robj *setTypeCreate(sds value) {" +
      "    if (isSdsRepresentableAsLongLong(value,NULL) == C_OK)" +
      "        return createIntsetObject();" +
      "    return createSetObject();" +
      "}")
      .interpretation("看set中要添加的值是否能够转成long long类型,如果可以,set的类型为IntSet,否则使用hash table");
复制代码

确定好结构之后,可以往里面去增加

  • 如果原本是 hashtable,那么直接插入即可;
  • 如果原本是intset,则需要看新插入的元素是否满足intset的结构,否则转成hashtable存储
Code.SLICE.source("else if (subject->encoding == OBJ_ENCODING_INTSET) {" +
        "        if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) {" +
        "            uint8_t success = 0;" +
        "            subject->ptr = intsetAdd(subject->ptr,llval,&success);" +
        "            if (success) {" +
        "                /* Convert to regular set when the intset contains" +
        "                 * too many entries. */" +
        "                if (intsetLen(subject->ptr) > server.set_max_intset_entries)" +
        "                    setTypeConvert(subject,OBJ_ENCODING_HT);" +
        "                return 1;" +
        "            }" +
        "        } else {" +
        "            /* Failed to get integer from object, convert to regular set. */"






请到「今天看啥」查看全文