set集合 结构体_set · web开发者知识体系 · 看云

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,身份证号

* 添加标签:可以通过标签的交并集计算用户喜好程度等数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值