【愚公系列】2022年05月 .NET架构班 049-分布式中间件 Redis存储原理之Set
【摘要】 前言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)