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

Redis数据结构——set

目录

set命令

sadd

smembers

sismember

spop

srandmember

smove

srem

集合间操作

sinter

sinterstore

sunion

sunionstore

sdiff

命令总结 

内部编码


set是集合的意思,集合就是把一些有关的数据放到一起。

集合有以下这样的特性:

1、集合中的元素是无序的,顺序交换一下还是同一个集合

2、集合中的元素是不能重复的(唯一的)

3、和list类似,集合中存储的元素都是string类型,可以使用json这样的格式存储结构化数据

set命令

sadd

往集合里面添加一个或者多个元素。

语法:

sadd key member[member ...]

我们把集合中的元素叫做member 。

返回值是成功添加了几个元素。

由于set是不能存储相同元素的,因此不能保证添加的元素就能被成功添加。

我们已经添加了1、2、3、4,再次添加就会返回0,一个都没有被成功添加,因为它们都重复了。

smembers

获取到集合中的所有元素,元素间的顺序是无所谓的。

语法:

smembers key

1、2、3、4就出来了。

sismember

判断元素是否在集合中。  

语法:

sismember key member 

spop

从"末尾"删除一个元素,集合中的元素是无序的,此时那个元素是"末尾"?使用spop删除元素的时候其实是随机删除。

语法:

spop key [count]

count不写的时候就随机删一个,写了的话就随机删除count个。

我们可以看到删除的顺序并不是我们添加的顺序。

返回值:删除的元素

srandmember

随机获取一个元素,并不会删除。

语法:

srandmember key

smove

将一个元素从源set中取出存到目的set中。大白话就是从一个set删除,在插入到另外一个set

语法:

smove source destination member

我们创建两个集合key1和key2,key1里面添加1、2、3、4元素,key2添加5、6、7、8元素,然后使用smove操作将key1里面的1删除插入到key2中。

如果此时我们在往key1里面插入一个1,再把1删除插入到key2中会发生什么呢?

此时并不会发生报错,此时会把源set中的member删除,目的set保持不变。

如果源set中就没有member,此时使用smove会怎么样?

key1中没有9,自然就会返回0,表示失败。

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

srem

删除元素,可以一次删除一个元素,也可以一次删除多个元素。

语法:

srem key member [member...]

 

返回值:删除成功的元素个数

集合间操作

既然是集合,肯定要有求交集、并集、差集的操作吧。

交集:最终结果同时出现在两个集合。

比如现在有集合A:1、2、3、4,集合B:3、4、5、6。A和B的交集就是3、4.

并集:把多个集合中的数据都集中放在一起,如果元素有重复,最终只保留一份。

还是拿上面的集合A、B来看,A和B的并集是1、2、3、4、5、6。

差集:A和B做差集就是,找出那些在A中存在,在B中不存在的元素。

A和B的差集就是1、2。

交集和并集是符合交换律的,但是差集就不同了A和B的差集和B和A的差集是不同的。

sinter

求交集。

语法:

sinter key [key...]

此处每个key都对应一个集合,返回值就是最终交集的数据。

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

sinterstore

这个命令同样也是求交集的。

语法:

sinterstore destination key [key ...] 

该命令是直接把算好的交集,放到destination中了 。

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

要想知道交集的内容,直接smembers destination即可。

sunion

求并集。

语法:

sunion key [key...]

 返回的是并集的结果数据。

时间复杂度:O(N),N是所有元素加在一起。

sunionstore

它和sinter一样,也提供了一个存储版本,直接把并集的结果存储到destination对应的集合中。

语法:

sunionstore destination key [key ...]

返回值:并集的元素个数

时间复杂度:O(N)

sdiff

求差集。

语法:

sdiff key [key...]

返回值:差集的结果。

时间复杂度:O(N),给定集合的总个数。

sdiffstore

将差集结果保存到key中。

语法:

sdiffstore destination [key ...]

返回值:差集的元素个数

下面可以看到key1和key2求差集和key2和key1求差集是不同的。

命令总结 

命令功能
sadd key element [element...]添加元素
srem key element [element...]删除元素
sismember key element 判断元素是否在集合中
srandmember key [count]随机返回一个元素
scard key(太简单就没演示)返回集合长度
spop key [count]尾删
smembers key获取集合所有元素
sinter key [key...] sinterstore求交集
sunion key [key...] sunionstore求并集
sdiff key [key ...] sdiffstore求差集

内部编码

intset(整数集合):为了节省空间做出的特定优化,当元素均为整数,并且元素个数不是很多的时候。

hashtable(哈希表)

key是整数的时候用的是intset,当我们插入了一个字符串后,就变成哈希表了。


http://www.mrgr.cn/news/93229.html

相关文章:

  • Java多线程与高并发专题——ConcurrentHashMap 在 Java7 和 8 有何不同?
  • C++————引用
  • 递归入手三维动态规划
  • Idea配置注释模板
  • 用CMake编译glfw进行OpenGL配置,在Visual Studio上运行
  • 图解MOE大模型的7个核心问题并探讨DeepSeekMoE的专家机制创新
  • 5年前问题的答案,如何造统计信息
  • Mybatis中的设计模式
  • 安装微软最新原版系统,配置好系统驱动并保留OOBE全新体验
  • JAVA入门——反射
  • 《Operating System Concepts》阅读笔记:p188-p199
  • 蓝桥杯C组真题——巧克力
  • Linux软件包管理
  • HTTP 黑科技
  • uniapp:小程序将base64图片字符串保存到手机相册
  • 免费分享一个软件SKUA-GOCAD-2022版本
  • C++11中atomic
  • 大模型在呼吸衰竭预测及围手术期方案制定中的应用研究
  • 计算机网络核心知识点:信道容量、OSI模型与调制技术详解
  • 鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态