SADD SADD key- name item [item ...]—— 将 一个 或 多个 元素 添加 到 集合 里面, 并 返回 被 添加 元素 当中 原本 并不 存在 于 集合 里面 的 元素 数量 SREM SREM key- name item [item ...]—— 从 集合 里面 移 除 一个 或 多个 元素, 并 返回 被 移 除 元素 的 数量 SISMEMBER SISMEMBER key- name item—— 检查 元素 item 是否 存在 于 集合 key- name 里 SCARD SCARD key- name—— 返回 集合 包含 的 元素 的 数量 SMEMBERS SMEMBERS key- name—— 返回 集合 包含 的 所有 元素 SRANDMEMBER SRANDMEMBER key- name [count]—— 从 集合 里面 随机 地 返回 一个 或 多个 元素。 当 count 为 正数 时, 命令 返回 的 随机 元素 不会 重复; 当 count 为 负数 时, 命令 返回 的 随机 元素 可能 会 出现 重复 SPOP SPOP key- name—— 随机 地 移 除 集合 中的 一个 元素, 并 返回 被 移 除 的 元素 SMOVE SMOVE source- key dest- key item—— 如果 集合 source- key 包含 元素 item, 那么 从 集合 source- key 里面 移 除 元素 item, 并将 元素 item 添加 到 集合 dest- key 中; 如果 item 被 成功 移 除, 那么 命令 返回 1, 否则 返回 0 SDIFF SDIFF key- name [key- name ...]—— 返回 那些 存 在于 第一个 集合、 但不 存在 于 其他 集合 中的 元素( 数学上 的 差 集 运算) SDIFFSTORE SDIFFSTORE dest- key key- name [key- name ...]—— 将那 些 存 在于 第一个 集合 但 并不 存在 于 其他 集合 中的 元素( 数学上 的 差 集 运算) 存储 到 dest- key 键 里面 SINTER SINTER key- name [key- name ...]—— 返回 那些 同时 存在 于 所有 集合 中的 元素( 数学上 的 交集 运算) SINTERSTORE SINTERSTORE dest- key key- name [key- name ...]—— 将那 些 同时 存在 于 所有 集合 的 元素( 数学上 的 交集 运算) 存储 到 dest- key 键 里面 SUNION SUNION key- name [key- name ...]—— 返回 那些 至少 存在 于 一个 集合 中的 元素( 数学上 的 并 集 计算) SUNIONSTORE SUNIONSTORE dest- key key- name [key- name ...]—— 将那 些 至少 存在 于 一个 集合 中的 元素( 数学上 的 并 集 计算) 存储 到 dest- key 键 里面 Set数据类型和List数据类型有点类似,也可以用来保存多个元素,但最大的一点区别在于Set数据类型不允许出现重复的元素,并且Set中的元素是无序的,所以没办法和List一样通过索引下标获取元素,但是Set类型支持多个Set集合取交集、并集、差集,所以合理使用Set数据类型,可以在实际项目开发中解决很多问题。Set数据类型有两种数据结构:IntSet和HashTable。首先我们来看看IntSet的结构: typedef struct intset { // 编码方式 uint32\_t enconding; // 集合包含的元素数量 uint32\_t length; // 保存元素的数组 int8\_t contents\[\]; } intset; 当Set集合中所有元素都为整型时,Redis才会使用IntSet数据结构。有一点需要格外注意的是:IntSet数据结构是有序的。因为为了减轻性能的消耗,Redis在Set集合元素都为整型时,会使用一种基于动态数组的结构体,同时在push元素的时候控制元素的大小顺序,这样就可以使用二分查找算法来对元素进行push及pop操作,这样时间复杂度仅为O(logN)。在Set集合中元素存在非整型数据时,Redis这时会自动采用HashTable数据结构来存放数据,在HashTable中,存放的只有key值而没有value值,所以说在HashTable中,键值永远为null。我们可以看下HashTable的结构: typedef struct dict{ //类型特定函数 dictType \*type; //哈希表 两个,一个用于实时存储,一个用于rehash dictht ht\[2\]; //rehash索引 数据迁移时使用 unsigned rehashidx; } **Set数据类型使用场景:** * 记录唯一值:比如登录ip,身份证号 * 添加标签:可以通过标签的交并集计算用户喜好程度等数据。