集合类型 的对象编码方式为 OBJ_ENCODING_INTSET 和 OBJ_ENCODING_HT,对应的 底层数据结构为
整数集合 intset
和字典 dict
编码转换
当 集合条件 可以同时满足以下条件的时候,对象使用 intset 结构,否则就使用 字典结构 作为底层实现
- 集合对象保存的所有元素都是 整数
- 集合对象的元素个数不能大于 512(这个限制是由
set-max-intset-entries
参数控制,对应 server 全局变量为server.set_max_intset_entries
,默认 512)
如果原本使用的是 intset 编码,当上述两个条件 任意一个条件不能被满足的时候,就会执行转码操作,原本保存在 整数集合中的元素都会被转移到 字典里面并保存,对象编码也会从 intset 转换成 hashtable
而 hashtable 结构的数据 元素值为字典的键,值一律为 NULL
下面我们就 Redis 集合类型 一些典型的 API 进行解析~~~
源码解析
由于有些方法里的代码量比较大,我们这里按照 典型的代码片段进行解析,同志们可以根据文章提示的代码位置 和 代码里面的关键词 在源码中搜素,可能数据结构一些元素 看不太懂什么意思,没关系,先混个脸熟,后面看完回头再看过来就明白了
首先我们上面提到的编码类型转换函数为 setTypeConvert()
集合添加命令 sadd 对应的函数为 saddCommand()
,主要的逻辑函数为 setTypeAdd()
|
|
类似 sadd 命令,另外一些 删除、查找 的函数逻辑总体来说还是比较简单的
不过有一些 差集、并集 的命令(sdiff、sdiffstore、sunion、sunionstore) 很值得探讨一下,这些命令的核心处理函数都为 sunionDiffGenericCommand()
而另外还有一个交集操作,命令(sinter、sinterstore) 很值得探讨一下,这些命令的核心处理函数都为 sinterGenericCommand()
本文作者: wettper
本文链接: http://www.web-lovers.com/redis-source-set.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!