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. */"