Redis 集合类型详解及应用

🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇

                                  ⭐ Set 类型⭐

🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇


1. 引言

上篇文章介绍的列表类型,集合类型也是保存多个字符串类型的元素的

Redis 集合类型保存多个字符串类型的元素,与列表类型不同的是:

  • 无序性:集合中的元素是无序的。
  • 唯一性:集合中的元素不允许重复。

一个集合中最多可以存储 2^32 - 1 个元素。Redis 支持集合内的增删查改操作,同时还支持多个集合之间的交集、并集和差集运算。合理地使用集合类型,可以在实际开发中解决很多问题。


2. 基本命令

添加元素

SADD:将一个或多个元素添加到集合中。重复的元素不会被添加。

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
获取所有元素

SMEMBERS:获取集合中的所有元素,注意元素间的顺序是无序的。

redis> SMEMBERS myset
1) "Hello"
2) "World"
检查成员

SISMEMBER:判断一个元素是否在集合中。

redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0
获取基数

SCARD:获取集合的基数,即集合中的元素个数。

redis> SCARD myset
(integer) 2
删除并返回元素

SPOP:从集合中删除并返回一个或多个元素。由于集合中的元素是无序的,所以取出哪个元素是随机的。

redis> SADD myset "one" "two" "three"
(integer) 3
redis> SPOP myset
"one"
redis> SPOP myset 2
1) "two"
2) "three"
移动元素
  • SMOVE:将一个元素从源集合移动到目标集合。
    redis> SADD myset "one" "two"
    (integer) 2
    redis> SADD myotherset "three"
    (integer) 1
    redis> SMOVE myset myotherset "two"
    (integer) 1
删除元素

SREM:从集合中删除指定的元素。

redis> SADD myset "one" "two" "three"
(integer) 3
redis> SREM myset "one" "four"
(integer) 1

3. 集合间操作

交集

SINTER:获取给定集合的交集中的元素。

redis> SADD key1 "a" "b" "c"
(integer) 3
redis> SADD key2 "c" "d" "e"
(integer) 3
redis> SINTER key1 key2
1) "c"

SINTERSTORE:获取给定集合的交集中的元素并保存到目标集合中。

redis> SINTERSTORE result key1 key2
(integer) 1
redis> SMEMBERS result
1) "c"
并集

SUNION:获取给定集合的并集中的元素。

redis> SUNION key1 key2
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

SUNIONSTORE:获取给定集合的并集中的元素并保存到目标集合中。

redis> SUNIONSTORE result key1 key2
(integer) 5
redis> SMEMBERS result
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"
差集

SDIFF:获取给定集合的差集中的元素。

redis> SDIFF key1 key2
1) "a"
2) "b"

SDIFFSTORE:获取给定集合的差集中的元素并保存到目标集合中。

redis> SDIFFSTORE result key1 key2
(integer) 2
redis> SMEMBERS result
1) "a"
2) "b"

4. 内部编码

Redis 会根据集合的实际内容选择不同的内部表示方法:

  • 整数集合(intset):当集合中的元素都是整数且数量少于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选择 intset 来存储,从而节省内存空间。
  • 哈希表(hashtable):当集合中的元素较多或包含非整数元素时,Redis 会使用 hashtable 来存储集合。

示例

使用整数集合:

redis> SADD setkey 1 2 3 4
(integer) 4
redis> OBJECT ENCODING setkey
"intset"

使用哈希表:

redis> SADD setkey 1 2 3 4 ... (超过 512 个元素)
(integer) 513
redis> OBJECT ENCODING setkey
"hashtable"

5. 实际应用场景

标签系统

集合类型非常适合用于标签系统。例如,用户对某些兴趣点感兴趣,这些兴趣点可以被抽象为标签。有了这些数据,就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这对于增强用户体验和用户黏度非常有帮助。

示例

给用户添加标签:

redis> SADD user:1:tags tag1 tag2 tag5
(integer) 3
redis> SADD user:2:tags tag2 tag3 tag5
(integer) 3

给标签添加用户:

redis> SADD tag1:users user:1 user:3
(integer) 2
redis> SADD tag2:users user:1 user:2 user:3
(integer) 3

删除用户下的标签:

redis> SREM user:1:tags tag1 tag5
(integer) 2

删除标签下的用户:

redis> SREM tag1:users user:1
(integer) 1
redis> SREM tag5:users user:1
(integer) 1

计算用户的共同兴趣标签:

redis> SINTER user:1:tags user:2:tags
1) "tag2"
2) "tag5"

 6. 命令小结

命令功能语法时间复杂度
SADD将一个或多个元素添加到集合中SADD key element [element ...]O(k),k 是元素个数
SREM从集合中删除一个或多个元素SREM key element [element ...]O(k),k 是元素个数
SCARD获取集合中的元素个数(基数)SCARD keyO(1)
SISMEMBER判断一个元素是否在集合中SISMEMBER key elementO(1)
SRANDMEMBER从集合中随机获取一个或多个元素SRANDMEMBER key [count]O(n),n 是 count
SPOP从集合中删除并返回一个或多个元素SPOP key [count]O(n),n 是 count
SMEMBERS获取集合中的所有元素SMEMBERS keyO(k),k 是元素个数
SINTER获取给定集合的交集中的元素SINTER key [key ...]O(m * k),k 是几个集合中元素最小的个数,m 是键个数
SINTERSTORE获取给定集合的交集中的元素并保存到目标集合中SINTERSTORE destination key [key ...]O(m * k),k 是几个集合中元素最小的个数,m 是键个数
SUNION获取给定集合的并集中的元素SUNION key [key ...]O(k),k 是多个集合的元素个数总和
SUNIONSTORE获取给定集合的并集中的元素并保存到目标集合中SUNIONSTORE destination key [key ...]O(k),k 是多个集合的元素个数总和
SDIFF获取给定集合的差集中的元素SDIFF key [key ...]O(k),k 是多个集合的元素个数总和
SDIFFSTORE获取给定集合的差集中的元素并保存到目标集合中SDIFFSTORE destination key [key ...]O(k),k 是多个集合的元素个数总和

 以上就是 Redis 中有关集合类型的命令和应用,感谢阅览!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值