5 种普通数据结构
这个没什么好说的,对 Redis 稍微有点了解的都知道 5 种最基本的数据结
构:String ,List ,Hash ,Set ,Sorted Set 。不过,需要注意的是,这
里依然有几个高频面试题。
Set 和 Hash 的关系
答案就是 Set 是一个特殊的 value 为空的 Hash 。Set 类型操作的源码在
t_set.c 中。以新增一个元素为例(
int setTypeAdd(robj *subject, sds value)
),如果编码类型是 OBJ_ENCODING_HT ,那么新增源码的源码如下,
事实上就是对 dict 即 Hash 数据结构进行操作,并且 dictSetVal 时
value 是 NULL :
dictEntry *de = dictAddRaw(ht,value,NULL);
if (de) {
dictSetKey(ht,de,sdsdup(value));
dictSetVal(ht,de,NULL);
return 1;
}
同样的,我们在 t_hash.c 中看到 Hash 类型新增元素时,当判断编码类型
是 OBJ_ENCODING_HT 时,也是调用 dict 的方法: dictAdd(o-
>ptr,f,v) ,dictAdd 最终也是调用 dictSetVal() 方法,只不过 v 即 value
不为 NULL :