【Redis笔记(五)】 Redis数据结构 - set集合

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50594005

今天到了我们Redis学习笔记的第五篇,今天我们来介绍set集合数据结构。老规矩,先“推广”一下前面的文章:


set类型介绍

和C++或Java编程语言中的set类型一样,Redis中的set类型也是一种无序集合,集合中的元素没有先后顺序,而且具有确定性、唯一性的特点。相比于我们前面介绍的list类型,set支持更加丰富的操作,比如求交、并、差集等。

set类型相关命令

1、sadd命令

sadd命令用来往集合中添加一个或多个元素,但是如果该元素已经在集合中则忽略之。操作成功后返回新成功添加到集合中的元素的数量。具体格式如下:

sadd key value1 value2...

示例1:

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

2、smembers命令

smembers用来获取集合中所有的元素。具体格式如下:

smembers key

示例2:

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

3、srem命令

srem命令用来删除结合中的一个或多个元素。如果该元素不在指定的集合中,则直接忽略。该命令返回值为从集合中删除的元素个数(不包括不存在的元素)。具体格式如下:

srem key value...

示例3:

127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> srem myset a
(integer) 1
127.0.0.1:6379> smembers myset
1) "c"
2) "b"
127.0.0.1:6379> srem myset z // 该元素不存在
(integer) 0

4、spop命令

spop命令的作用比较“有趣”,该命令可以随机移除并返回集合中的一个元素。具体格式如下:

spop key

示例4:

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> spop myset
"one"
127.0.0.1:6379> smembers myset
1) "three"
127.0.0.1:6379> spop myset2 // 该集合不存在
(nil)

5、srandmember命令

srandmember命令随机返回集合中的一个元素(注意与spop命令的区别)。具体格式如下:

srandmember key

示例5:

127.0.0.1:6379> sadd myset one two three
(integer) 3
127.0.0.1:6379> srandmember myset
"three"
127.0.0.1:6379> srandmember myset1  // 该集合不存在
(nil)

7、sismember命令

sismember命令用来判断集合中某个元素是否存在,如果存在,返回整数1,否则返回0。具体格式如下:

sismember key value

示例7:

127.0.0.1:6379> sadd myset one two three
(integer) 3
127.0.0.1:6379> sismember myset one
(integer) 1
127.0.0.1:6379> sismember myset four
(integer) 0

8、scard命令

scard命令返回集合中元素的个数,如果给集合不存在,则返回0。具体格式如下:

scard key

示例8:

127.0.0.1:6379> sadd myset one two three
(integer) 3
127.0.0.1:6379> scard myset
(integer) 3

9、smove命令

smove将一个集合source中的指定元素移动到另一个集合dest中。如果指定元素不存在source中,则不执行任何操作直接返回0,如果指定元素成功移除,则返回整数1。具体格式如下:

smove source dest value

示例9:

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

10、sinter命令

sinter命令用来求指定所有结合的交集。具体格式如下:

sinter key1 key2 key3...

示例10:

127.0.0.1:6379> sadd set1 a b c
(integer) 3
127.0.0.1:6379> sadd set2 a e d
(integer) 3
127.0.0.1:6379> sadd set3 d
(integer) 1
127.0.0.1:6379> sinter set1 set2 set3
(empty list or set)
127.0.0.1:6379> sinter set1 set2
1) "a"

11、sunion命令

sunion命令用来求指定所有集合的并集。具体格式如下:

sunion key1 key2...

示例11:

127.0.0.1:6379> sadd set1 a b c
(integer) 3
127.0.0.1:6379> sadd set2 a e d
(integer) 3
127.0.0.1:6379> sunion set1 set2
1) "c"
2) "a"
3) "b"
4) "e"
5) "d"
127.0.0.1:6379> sunion set1 set100 // set100不存在,当做空集合
1) "c"
2) "a"
3) "b"

12、sdiff命令

sdiff命令用来求一个集合与给定集合的差集。具体格式如下:

sdiff key1 key2

示例11:

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

13、sinterstore命令

与sinter命令相似, sinterstore也可以用来求多个集合的交集。不同的是sinterstore命令并不是直接返回结果结合,而是把结果保存在指定的集合中并返回结果集中元素的个数。注意,如果指定的结果集已经存在,则会被重写。具体格式如下:

 sinterstore dest key1 key2 ...

示例13:

127.0.0.1:6379> sadd set1 a b c
(integer) 3
127.0.0.1:6379> sadd set2 c e d
(integer) 3
127.0.0.1:6379> sinterstore set3 set1 set2
(integer) 1

同样的,对于sunion、sdiff命令,Redis也提供了类似的store命令,具体如下:

sunionstore dest key1 key2 ...
sdiffstore dest key1 key2 ...
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis中的zset是有序集合,而set是无序集合。 在zset中,每个元素都有一个score字段,通过score和index来进行排序。zset的实现是使用了两种数据结构,分别是跳跃表和字典。跳跃表用于实现元素的有序排列,而字典用于实现元素的唯一性。zset的插入、删除和查找操作的时间复杂度都是O(logN)。 而set是一个无序的字符串集合集合中的元素不可重复。在set中,元素的插入、删除和查找操作的时间复杂度都是O(1)。set的底层实现是通过哈希表来存储元素,类似于Java中的Hashtable集合。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [9. redis 数据结构-set、zset](https://blog.csdn.net/wojiuguowei/article/details/81866600)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Redis学习笔记(九)---Redis数据类型之Set 和 Zset](https://blog.csdn.net/TheWindOfSon/article/details/104169173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值