集合(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"

常用场景

随机数

生成随机数,比如抽奖

共同爱好

根据两个用户的喜好求出交集