集合(set)与列表(list)一样也是用于存储多个字符串,但是集合(set)不允许有重复的元素,并且集合中的元素是无序的,不能通过下标获取元素
常用命令
添加
sadd:添加元素,返回集合元素个数
sadd key member1 member2
删除
srem:删除元素,返回删除的元素个数
srem
查询
scard:查询集合元素个数
scard key
smembers:查询集合中全部元素
smembers key
sismember**:查询集合中是否包含该元素,返回1或0
sismember key member
srandmember:随机返回集合中的元素,默认为1个
srandmember key [count]
127.0.0.1:6379> srandmember set
"d"
127.0.0.1:6379> srandmember set 3
1) "e"
2) "d"
3) "c"
spop:从集合中随机弹出元素,删除并返回该元素,如果集合为空,返回nil;redis3.2以后,也支持count
spop key [count]
其他命令
求两个集合的交集、并集、差集
sinter:求两个集合的交集
sinter key1 key2
现在有两个set,set1集合元素为a、b、c
,set2集合元素为b、c、d
,返回交集b、c
交集 = 两个集合相加后重复的元素
127.0.0.1:6379> sinter set1 set2
1) "c"
2) "b"
127.0.0.1:6379>
sunion:求两个集合的并集
sunion key1 key2
并集 = 两个集合相加并去重后的元素
127.0.0.1:6379> sunion set1 set2
1) "d"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379>
sdiff:求两个集合的差集
sdiff key1 key2
差集 = 第一个集合减去第二个集合后第一个集合剩余的元素
127.0.0.1:6379> sdiff set1 set2
1) "a"
127.0.0.1:6379>
将交集、并集、差集保存
sinterstore:将两个集合的交集保存到新的集合
sinterstore newkey key1 key2
sunionstore:将两个集合的并集保存到新的集合
sunionstore newkey key1 key2
sdiffstore:将两个集合的差集保存到新的集合
sdiffstore newkey key1 key2
内部编码
字符串类型内部有2种编码:
- intset(整数集合):当集合中的元素都是 整数 且 元素个数 小于
set-max-intset-entries
配置(默认512
个)时,Redis
会选用intset
来作为 集合 的 内部实现,从而 减少内存 的使用。 - hashtable(哈希表):当集合类型 无法满足
intset
的条件时,Redis
会使用hashtable
作为集合的 内部实现。
可以使用object encoding key
查看当前编码
当元素个数 小于512个 且都为 整数 时,内部编码 为 intset
。
127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset"
当 元素个数 超过 512
个,内部编码 变为 hashtable
。
127.0.0.1:6379> sadd setkey 1 2 3 4 5 6 ... 512 513
(integer) 513
127.0.0.1:6379> scard setkey
(integer) 513
127.0.0.1:6379> object encoding listkey
"hashtable"
当某个元素 不为整数 时,内部编码 也会变为 hashtable
。
127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"hashtable"
常用场景
随机数
生成随机数,比如抽奖
共同爱好
根据两个用户的喜好求出交集