【愚公系列】2022年05月 .NET架构班 049-分布式中间件 Redis存储原理之Set

举报
愚公搬代码 发表于 2022/05/02 15:02:49 2022/05/02
【摘要】 前言Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。Set 和list一样。可添加,删除,或判断元素是否存在的操作。Set 和list类型不同,不允许出现重复的元素。和c++的set容器是完全相同。set类...

前言

Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。

  • Set 和list一样。可添加,删除,或判断元素是否存在的操作。
  • Set 和list类型不同,不允许出现重复的元素。和c++的set容器是完全相同。
  • set类型功能上存在服务器端完成聚合计算。效率很高,节省网络的开销。
  • Set 最大允许元素4294967295。

一、Redis存储原理之Set

数组+Hash表:Hash表防止数据重复,使用Hash碰撞。
在这里插入图片描述
Redis 用 intset 或 hashtable 存储 set。

  • 如果元素都是整数类型,就用 inset 存储。
  • 如果不是整数类型,就用 hashtable(数组+链表的存来储结构)。

2.Set编码类型

Set的编码有三种:

  • int:存储 8 个字节的长整型(long,2^63-1)。大小超过了 long 的范围
    (2^63-1=9223372036854775807)时会自动转成embstr。
  • embstr:代表 embstr 格式的 SDS(Simple Dynamic String 简单动态字符串), 存储小于 44
    个字节的字符串。分配一次内存空间,而且是只读的。
  • raw:存储大于 44 个字节的字符串(3.2 版本之前是 39 字节)。分配二次内存空间。

3.应用场景

场景 说明
抽奖 随机获取元素 spop myset
点赞、签到、打卡 可以去重
商品筛选 差集 :sdiff set1 set2 。交集:sinter set1 set2 。并集:sunion set1 set2。

4.相关操作命令

# 添加一个或者多个元素
sadd myset a b c d e f g

# 获取所有元素
smembers myset

# 统计元素个数
scard myset

# 随机获取一个元素
srandmember key

# 随机弹出一个元素
spop myset

# 移除一个或者多个元素
srem myset d e f

# 查看元素是否存在
sismember myset a
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。