Redis从入门到实战(十四、集合(Set))

60 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

1、集合(Set)

Redis 的 Set 是 String 类型的无序集合集合成员是唯一的,这就意味着集合中不能出现重复的数据。

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

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。

1.1、SADD key member1 [member2]

将一个或多个成员元素加入到集合中,不能重复

127.0.0.1:6379> sadd book java vue spring
(integer) 3

1.2、SMEMBERS key

返回集合中的所有成员。

127.0.0.1:6379> smembers book
1) "vue"
2) "java"
3) "spring"

1.3、SISMEMBER key member

判断 member 元素是否是集合 key 的成员

127.0.0.1:6379> sismember book java
(integer) 1
127.0.0.1:6379> sismember book go
(integer) 0

1.4、SCARD key

获取集合里面的元素个数

127.0.0.1:6379> scard book
(integer) 3

1.5、SREM key member1 [member2]

移除集合中一个或多个成员

127.0.0.1:6379> srem book spring
(integer) 1

1.6、SRANDMEMBER key [count]

令用于返回集合中的一个随机元素。

127.0.0.1:6379> srandmember book
"java"
127.0.0.1:6379> srandmember book 2
1) "vue"
2) "java"

1.7、SPOP key

移除并返回集合中的一个随机元素

127.0.0.1:6379> smembers book
1) "vue"
2) "java"
127.0.0.1:6379> spop book
"java"
127.0.0.1:6379> smembers book
1) "vue"

1.8、SMOVE source destination member

将 member 元素从 source 集合移动到 destination 集合

127.0.0.1:6379> sadd book java go spring
(integer) 3
127.0.0.1:6379> smembers book
1) "vue"
2) "go"
3) "java"
4) "spring"
127.0.0.1:6379> smove book books java
(integer) 1

1.9、SDIFF key1 [key2]

返回第一个集合与其他集合之间的差异。

127.0.0.1:6379> smembers book
1) "vue"
2) "go"
3) "spring"
127.0.0.1:6379> smembers books
1) "vue"
2) "springboot"
3) "java"
127.0.0.1:6379> sdiff book books
1) "go"
2) "spring"

1.10、SINTER key1 [key2]

返回给定所有集合的交集

127.0.0.1:6379> sinter book books
1) "vue"

1.11、SUNION key1 [key2]

返回所有给定集合的并集

127.0.0.1:6379> sunion book books
1) "vue"
2) "springboot"
3) "go"
4) "spring"
5) "java"

1.12、应用学习

在我们的实际项目中,例如在微博中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为 集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集 合中。

1、小明的爱好关注了:足球、电影、王者荣耀、电子书。

2、小兰的爱好关注了:电影、体育、衣服、彩妆。

将他们的爱好都存入到集合中:

127.0.0.1:6379> sadd xiaoming football dianying wangzhe dianzishu
(integer) 4
127.0.0.1:6379> sadd xiaolan dianying tiyu yifu caizhuang
(integer) 4

下面将实现以下功能:

  • 统计小明的爱好有几个?,小兰的爱好有几个?
127.0.0.1:6379> scard xiaoming
(integer) 4
127.0.0.1:6379> scard xiaolan
(integer) 4
  • 小明和小兰共同的爱好有哪些?
127.0.0.1:6379> sinter xiaoming xiaolan
1) "dianying"
  • 有哪些是小明的爱好但不是小兰的爱好?,有哪些是小兰的爱好但不是小明的爱好
127.0.0.1:6379> sdiff xiaoming xiaolan
1) "football"
2) "dianzishu"
3) "wangzhe"
127.0.0.1:6379> sdiff xiaolan xiaoming
1) "tiyu"
2) "yifu"
3) "caizhuang"
  • 小明和小兰总共有哪些爱好?
127.0.0.1:6379> sunion xiaoming xiaolan
1) "football"
2) "dianzishu"
3) "dianying"
4) "wangzhe"
5) "yifu"
6) "caizhuang"
7) "tiyu"
  • 判断体育是否是小明的爱好。
127.0.0.1:6379> sismember xiaoming tiyu
(integer) 0
  • 判断体育是否是小兰的爱好。
127.0.0.1:6379> sismember xiaolan tiyu
(integer) 1
  • 将体育从小兰的爱好中移除。
127.0.0.1:6379> srem xiaolan tiyu
(integer) 1
127.0.0.1:6379> smembers xiaolan
1) "dianying"
2) "caizhuang"
3) "yifu"