当前位置: 首页 > article >正文

【Redis】Redis Set 集合常见命令, 内部编码以及使用场景介绍

目录

1. 普通命令

SADD

SMEMBERS

SISMEMBER

SCARD

SPOP

SMOVE

SREM

2. 集合间操作

SINTER

SINTERSTORE

SUNION

SUNIONSTORE

SDIFF

SDIFFSTORE

3. 命令小结

4. 内部编码

5. 使用场景


集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中

1)元素之间是无序的

2)元素不允许重复

如下图 示。一个集合中最多可以存储 2^32- 1个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。

1. 普通命令

SADD

将一个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中。

语法:

SADD key member [member ...]

时间复杂度: O(1)

返回值: 本次添加成功的元素个数。

示例:

127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 0
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"

SMEMBERS

获取一个 set 中的所有元素,注意,元素间的顺序是无序的。

语法:

SMEMBERS key

示例:

时间复杂度: O(N)

返回值: 所有元素的列表。

示例:

127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"

SISMEMBER

判断一个元素在不在 set 中。

语法:

SISMEMBER key member

时间复杂度: O(1)

返回值: 1表示元素在 set 中。0表示元素不在 set 中或者 key 不存在。

示例:

127.0.0.1:6379> sadd myset "one"
(integer) 1
127.0.0.1:6379> sismember myset "one"
(integer) 1
127.0.0.1:6379> sismember myset "tow"
(integer) 0

SCARD

获取一个 set 的基数(cardinality),即 set 中的元素个数。

语法:

SCARD key

时间复杂度: O(1)

返回值: set内的元素个数。

示例:

127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2

SPOP

从 set 中删除并返回一个或者多个元素。注意,由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。

语法:

SPOP key [count]

时间复杂度: O(N),n是count

返回值:取出的元素。

示例:

127.0.0.1:6379> sadd myset "one" "two" "three"
(integer) 3
127.0.0.1:6379> spop myset
"two"
127.0.0.1:6379> smembers myset
1) "three"
2) "one"
127.0.0.1:6379> sadd myset "four" "five"
(integer) 2
127.0.0.1:6379> spop myset 3
1) "four"
2) "five"
3) "three"
127.0.0.1:6379> smembers myset
1) "one"

SMOVE

将一个元素从源 set 取出并放入目标 set 中。

语法:

SMOVE source destination member

时间复杂度: O(1)

返回值: 1表示移动成功,0表示失败。

示例:

127.0.0.1:6379> sadd myset1 "one" "two"
(integer) 2
127.0.0.1:6379> sadd myset2 "three"
(integer) 1
127.0.0.1:6379> smove myset1 myset2 "two"
(integer) 1
127.0.0.1:6379> smembers myset1
1) "one"
127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

SREM

将指定的元素从 set 中删除。

语法:

SREM key member [member ...]

时间复杂度: O(N), N是要删除的元素个数

返回值: 本次操作删除的元素个数。

示例:

127.0.0.1:6379> sadd myset "one" "two" "three"
(integer) 3
127.0.0.1:6379> srem myset "one"
(integer) 1
127.0.0.1:6379> srem myset "four"
(integer) 0
127.0.0.1:6379> smembers myset
1) "three"
2) "two"

2. 集合间操作

交集(inter)、并集(union)、差集(diff)的概念如图所示。

集合求交集、并集、差集

SINTER

获取给定 set 的交集中的元素。

语法:

SINTER key [key ...]

时间复杂度: O(N*M), N是最小的集合元素个数. M是最大的集合元素个数

返回值: 交集的元素。

示例:

127.0.0.1:6379> sadd key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> sadd key2 "c" "d" "e" "f"
(integer) 4
127.0.0.1:6379> sinter key1 key2
1) "d"
2) "c"

SINTERSTORE

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

语法:

SINTERSTORE destination key [key ...]

时间复杂度: O(N*M), N是最小的集合元素个数. M 是最大的集合元素个数

返回值: 交集的元素个数。

示例:

127.0.0.1:6379> sadd key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> sadd key2 "c" "d" "e" "f"
(integer) 4
127.0.0.1:6379> sinterstore key key1 key2
(integer) 2
127.0.0.1:6379> smembers key
1) "c"
2) "d"

SUNION

获取给定 set 的并集中的元素。

语法:

SUNION key [key ...]

时间复杂度: O(N), N给定的所有集合的总的元素个数

返回值: 并集的元素。

示例:

127.0.0.1:6379> sadd key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> sadd key2 "c" "d" "e" "f"
(integer) 4
127.0.0.1:6379> sunion key1 key2
1) "d"
2) "c"
3) "a"
4) "f"
5) "b"
6) "e"

SUNIONSTORE

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

语法:

SUNIONSTORE destination key [key ...]

时间复杂度: O(N), N给定的所有集合的总的元素个数

返回值: 并集的元素个数。

示例:

127.0.0.1:6379> sadd key1 "a" "b" "c"
(integer) 3
127.0.0.1:6379> sadd key2 "c" "d" "e"
(integer) 3
127.0.0.1:6379> sunionstore key key1 key2
(integer) 5
127.0.0.1:6379> smembers key
1) "c"
2) "a"
3) "d"
4) "b"
5) "e"

SDIFF

获取给定 set 的差集中的元素。

语法:

SDIFF key [key ...]

时间复杂度: O(N), N给定的所有集合的总的元素个数

返回值: 差集的元素。

示例:

127.0.0.1:6379> sadd key1 "a" "b" "c"
(integer) 3
127.0.0.1:6379> sadd key2 "c" "d" "e"
(integer) 3
127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "b"

SDIFFSTORE

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

语法:

SDIFFSTORE destination key [key ...]

时间复杂度:O(N), N给定的所有集合的总的元素个数.

返回值:差集的元素个数。

示例:

127.0.0.1:6379> sadd key1 "a" "b" "c"
(integer) 3
127.0.0.1:6379> sadd key2 "c" "d" "e"
(integer) 3
127.0.0.1:6379> sdiffstore key key1 key2
(integer) 2
127.0.0.1:6379> smembers key
1) "a"
2) "b"

3. 命令小结

小表总结了集合类型的常见命令,开发人员可以根据自身需求进行选择

4. 内部编码

集合类型的内部编码有两种:

1)当元素个数较少并且都为整数时,内部编码为intset:

2)当元素个数超过 512个,内部编码为 hashtable:

3)当存在元素不是整数时,内部编码为 hashtable

5. 使用场景

集合类型比较典型的使用场景是标签(tag)。例如A用户对娱乐、体育板块比较感兴趣,B用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同一个标签
的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。例如一个电子商务网站会对不同标签的用户做不同的产品推荐。

下面的演示通过集合类型来实现标签的若干功能。

1) 给用户添加标签

2) 给标签添加用户

3) 删除用户下的标签

4) 删除标签下的用户

5) 计算用户的共同兴趣标签

 


http://www.kler.cn/a/421069.html

相关文章:

  • 三步入门Log4J 的使用
  • UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets
  • python实现c++中so库调用及dbus服务开发
  • AIGC 时代的文学:变革与坚守
  • 【Linux】常用命令二
  • Ai编程cursor + sealos + devBox实现登录以及用户管理增删改查(十三)
  • 【C++】双温度转换与并联电阻计算的编程题分析与优化
  • K8S集群的高可用性(HA)架构如何设计
  • 插入排序⁻⁻⁻⁻直接插入排序希尔排序
  • LLM:一个小型搜索agent的实现
  • 肝硬化腹水中医怎么治疗
  • TypeScript 在 React 中的应用
  • 每日一题 LCR 039. 柱状图中最大的矩形
  • openjdk17 jvm 大对象 内存分配 在C++源码体现
  • RouterOS ROSV7 基于域名的分流实现
  • 构建短视频矩阵生态体系开发分享
  • 卷积网络和残差网络
  • 【AI系统】Ascend C 语法扩展
  • 家政小程序开发,打造便捷家政生活小程序
  • C# 定时通讯的高速串口的编程框架
  • C++(六)
  • 手机设置了卡2上网,卡1禁止上网,但是卡1还是会偷偷跑流量,这是什么情况???
  • 【HTTP】HTTP协议
  • 嵌入式蓝桥杯学习1 电量LED
  • Kylin Server V10 下基于Kraft模式搭建Kafka集群
  • Leetcode 每日一题 383.赎金信