Redis数据结构和内部编码--集合(Set)
一.概念
集合也是用来存储多个字符串元素,但和列表示有区别的,集合中的元素是无序且无重复的,不能用下标来获取元素。在Redis中,一个集合最多可以存储2^32个元素,除了支持对集合的增删改查外,还支持对多个集合取交集、并集、差集。
二. 命令
2.1 添加元素
命令:sadd key value[value2…],返回添加成功的元素个数
例如:sadd sets v1 v2
返回:2
2.2 删除元素
命令:srem key value[value2…],返回成功删除的元素个数
例如:sadd sets v1 v2 v3
srem sets v2 v3
返回:2
2.3 计算元素个数
命令:scard key
例如:sadd sets v1 v2 v3
scard sets
返回:3
2.4 判断元素是否在集合中
命令: sismember key element,如果元素在集合中返回1,否则返回0
例如:sadd sets v1 v2 v3
sismember sets v1
返回:1
2.5 随机从集合中返回指定个数的元素
命令: srandmember key [count], count为可选参数,不选表示1.
例如:sadd sets v1 v2 v3
srandmember sets 2
返回:集合sets中任意的2个元素
2.6 从集合中随机弹出元素
命令: spop key [count], count为可选参数,不选表示1.
例如: sadd sets v1 v2 v3
spopsets 2
返回:随机弹出的2个元素
2.7 获取所有元素
命令:smembers key
例如:sadd sets v1 v2 v3
smembrs sets
返回:v1
v3
v2
2.8 求多个集合的交集
命令:sinter key[key2..]
例如:sadd set1 v1 v2
sadd set2 v2 v3 v4
sinter set1 set2
返回:v2
2.9 求多个集合的并集
命令:sunion key[key2..]
例如:sadd set1 v1 v2
sadd set2 v2 v3 v4
sunion set1 set2
返回:v1
v2
v3
v4
2.10 求多个集合的差集
命令:sdiff key[key2..] 返回所有属于集合key且不属于集合key2的元素
例如:sadd set1 v1 v2
sadd set2 v2 v3 v4
sdiff set1 set2
返回:v1
v3
v4
2.11将交集、并集、差集的结果保存
命令:
(1) sinterstore destinationkey[key2…]
(2) sunionstore destinationkey[key2…]
(3) sdiffstore destination key[key2…]
例如:sadd set1 v1 v2
sadd set2 v2 v3 v4
sinterstore interstore set1 set2
smembers interstore
返回:v2
三. set命令的时间复杂度
四. 内部编码
集合类型的内部编码有两种:
(1) intset(整数集合),当集合中的元素都是整数,且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会采用intset来做为集合的内部实现,从而减少内存的使用。
(2) hashtable(哈希表),当集合类型无法满足intset的条件时,Redis就会使用hashtable做为集合的内部实现。
五. 集合的使用场景及方案
(1)sadd = Tagging(标签)
(2)spop/srandmember=Random item生产随机数(抽奖)
(3)sadd+sinter=Social Graph(社交生活)
知识小贴士:作者尽心运营的知识星球社群【请点击:简道源码&&架构分析 加入】(可添加运营同学WX:wx454876882)持续拉新中...,定期的jdk与核心框架源码解析,主流行业解决方案与架构设计资料查阅与下载尽在其中。帮助行业新人和有志于技术的专业人士体系化的学习源码与系统架构,获取业界知名技术峰会和厂商对外公布的主流业务场景的解决方案。同时这个星球也是一个社群,大家可以在社群中结识有识之士,共同探讨,答疑解惑。希望可以通过这个星球帮助大家每日进步一点点,一年持续365天,共勉
本星球 聚焦于Java源码分析,架构解析。低代码,可扩展和高可用架构设计。帮助你更好地学编程,欢迎想进步的同学!仅精品案例的资料整理即物超所值。让我们大家一起每日进步一点点~~,你可以:
1. 阅读星球专属的编程知识和优质文章
2.JAVA知识从点和面,深度挖掘。通过点,形成面。提升自身的技术广度和深度。
3. 加入星球专属交流群,帮你找到学习伙伴、获取每日优质文章推送等
4.业界优秀案例资料学习及下载
5. 和伙伴们一起学习打卡,增加动力,共同进步
6.工作、学习和方法论。如何提升软实力,比如写文章、画架构图、技术产品的营销、社区的运营等等。
7.招聘、面试和晋升。如何提前准备面试,有什么套路?如何提升硬实力,少走弯路?
8.提供简历优化服务哟。本人常年招聘,也就面试了1000+程序员和架构师~~
9.解答你的疑问。
10.每日进步一点点(最重要的一点): 让自己与众不同,每天学习1-2小时源码和架构知识,365天后再回首,1年前的自己可能是个SB吧。用通勤的时间让自己成长,让优秀变成一种习惯。