Redis-Set
Redis中关于set的操作
文章目录
前言
Redis是⼀种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满⾜很多的应⽤场景,⽽且因为Redis会将所有数据都存放再内存中,所以它的读写性能⾮常惊⼈。不仅如此,Redis还可以将内存的数据利⽤快照和⽇志的形式保存到硬盘上,这样在发⽣类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流⽔线、Lua脚本等附加功能。总之,如果在合适的场景使⽤号Redis,它就会像⼀把瑞⼠军⼑⼀样所向披靡。
本文介绍了Redis中有关set集合的操作命令,来帮助大家理解Redis中set集合。
一、set集合是什么?
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中元素之间是⽆序
的并且元素不允许重复,Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。
二、set基本命令操作
1.sadd操作
sadd:将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中。
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:本次添加成功的元素个数。
语法:sadd key member [member …]
redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis>s add myset "World" //去重操作
(integer) 0
redis> smembers myset //查看myset中的元素,返回的是元素的值
1) "Hello"
2) "World"
2.smembers操作
获取⼀个set中的所有元素,注意,元素间的顺序是⽆序的。
命令有效版本:1.0.0之后
时间复杂度:O(N)
返回值:所有元素的列表。
语法:smembers key
代码如下(示例):
redis> sadd myset "Hello" //添加元素
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> smembers myset //获取元素
1) "Hello"
2) "World"
3.sismember操作
判断⼀个元素在不在set中。
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在。
语法: sismember key member
代码如下(示例):
redis> sadd myset "one"
(integer) 1
redis> sismember myset "one"
(integer) 1
redis> sismember myset "two"
(integer) 0
4.scard操作
获取⼀个set的基数(cardinality),即set中的元素个数。
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:set内的元素个数。
语法: scard key
代码如下(示例):
redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> scard myset
(integer) 2
5.spop操作
从set中删除并返回⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在。
语法: spop key [count]
代码如下(示例):
redis> sadd myset "one"
(integer) 1
redis> sadd myset "two"
(integer) 1
redis> sadd myset "three"
(integer) 1
redis> spop myset
"one"
redis> smembers myset
1) "three"
2) "two"
redis> sadd myset "four"
(integer) 1
redis> sadd myset "five"
(integer) 1
redis> spop myset 3
1) "three"
2) "four"
3) "two"
redis> smembers myset
1) "five"
6.smove操作
将⼀个元素从源set取出并放⼊⽬标set中。
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:1表⽰移动成功,0表⽰失败。
语法: smove source destination member
代码如下(示例):
redis> sadd myset "one"
(integer) 1
redis> sadd myset "two"
(integer) 1
redis> sadd myotherset "three"
(integer) 1
redis> smove myset myotherset "two"
(integer) 1
redis> smembers myset
1) "one"
redis> smembers myotherset
1) "three"
2) "two"
7.srem操作
将指定的元素从set中删除。
命令有效版本:1.0.0之后
时间复杂度:O(N),N是要删除的元素个数.
返回值:本次操作删除的元素个数。
语法: srem key member [member …]
代码如下(示例):
redis> sadd myset "one"
(integer) 1
redis> sadd myset "two"
(integer) 1
redis> sadd myset "three"
(integer) 1
redis> srem myset "one"
(integer) 1
redis> srem myset "four"
(integer) 0
redis> smembers myset
1) "three"
2) "two"
8.sinter操作
获取给定set的交集中的元素。
命令有效版本:1.0.0之后
时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数.
返回值:交集的元素。
语法: sinter key [key …]
代码如下(示例):
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sinter key1 key2
1) "c"
9.sinterstore操作
获取给定set的交集中的元素并保存到⽬标set中。(其他集合操作也有相关store等操作,后面不加以赘述)。
命令有效版本:1.0.0之后
时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数.
返回值:交集的元素个数。
语法: sinterstore destination key [key …]
代码如下(示例):
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sinterstore key key1 key2
(integer) 1
redis> smembers key
1) "c"
10.sunion操作
获取给定set的并集中的元素。
命令有效版本:1.0.0之后
时间复杂度:O(N),N给定的所有集合的总的元素个数.
返回值:并集的元素。
语法: sunion key [key …]
代码如下(示例):
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sunion key1 key2
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"
1) "c"
11.sdiff操作
获取给定set的差集中的元素。(不满足交换律)
命令有效版本:1.0.0之后
时间复杂度:O(N),N给定的所有集合的总的元素个数.
返回值:差集的元素。
语法: sdiff key [key …]
代码如下(示例):
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sdiff key1 key2
1) "a"
2) "b"
三、命令小结操作
| 命令 | 时间复杂度 |
|---|---|
| sadd key element [element…] | O(k),k是元素个数 |
| srem key element [element…] | O(k),k是元素个数 |
| scard key | O(1) |
| sismember key element | O(1) |
| srandmember key[count] | O(n),n是count |
| spop key [count] | O(n),n是count |
| smembers key | O(k),k是元素个数 |
| sinter key [key…] sitnerstore | O(m*k),k是⼏个集合中元素最⼩的个数,m是键个数 |
| sunion key [key…] sunionstore | O(k),k是多个集合的元素个数总和 |
| sdiff key [key…] sdiffstore | O(k),k是多个集合的元素个数总和 |
总结
本文介绍了redis中set的有关操作,并且给出了相应的操作代码示例,分析了相关操作的时间复杂度。希望以上内容能帮助大家了解到set的相关知识。
更多推荐

所有评论(0)