系统学习redis之六——redis数据类型之set数据类型及操作

set数据类型介绍

set是集合,它是string类型的无序集合,是随机的,没有顺序。set是通过hash table实现的,添加、删除和查找的复杂度都是0(1)。对集合我们可以取并集、交集和差集。通过这些操作,我们可以实现sns中的好友推荐和blog的tag功能。

关于并集、交集和差集,举个例子:

集合1有数字1,2
集合2有数字2,3
那么
并集=1,2,3
交集=2
差集=1,3

set数据类型方法

  • sadd:向指定的set中添加元素,并且不允许同一个元素重复存在即已经存在的元素会添加不成功,返回值为0
  • smembers:查看指定set的所有元素
  • srem:删除set中指定的元素。rem即remove的缩写
  • spop:随机返回并删除set中名称为key的一个元素
  • sdiff:返回两个指定集合的差集(即返回所有给定key与第一个key的差集)
  • sdiffstore:返回所有给定key与第一个key的差集,并将结果存为另一个key(也就是说,sdiff只能返回差集,但是不能把结果存下来,sdiffstore就能将返回的差集存下来)
  • sinter:返回所有给定key的交集
  • sinterstore:返回所有给定key的交集,并将结果存为另一个key
  • sunion:返回所有给定key的并集
  • sunionstore:返回所有给定key的并集,并将结果存为另一个key
  • smove:从第一个key对应的set中移除member并添加到第二个对应的set中
  • scard:返回指定key的set的元素个数
  • sismember:测试member是否是名称为key的set的元素
  • srandmember:随机返回名称为key的set的一个元素,但是不删除元素(即随机取指定set里面的某个元素,而且不删除)

方法及操作

1)sadd:向指定的set中添加元素,并且不允许同一个元素重复存在即已经存在的元素会添加不成功,返回值为0
例如:向myset1中添加一个“crystal”的元素,一个“crystalnew”的元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SADD myset1 crystal       #myset1表示set名称,crystal表示元素
(integer) 1
127.0.0.1:6379> SADD myset1 crystalnew
(integer) 1
127.0.0.1:6379> SADD myset1 crystal   #因为crystal这个元素已经存在,所以这里返回0,表示添加不成功
(integer) 0
127.0.0.1:6379> SMEMBERS myset1     #查看myset1中,只有两个元素
1) "crystalnew"
2) "crystal"
127.0.0.1:6379> 

备注,同《系统学习redis之三——redis数据类型之string类型及操作》一样,后面的例子也都在同一台机器一次性操作完毕的,因为后面的代码如果不加上“ [root@test101 redis-4.0.1]# src/redis-cli ”这一句。代码高亮也会格式有问题,所以后面所有的例子中都加上了“[root@test101 redis-4.0.1]# src/redis-cli ”,只是为了格式问题。

2)smembers:查看指定set的所有元素
例如:查看myset1的所有元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1     #查看myset1的全部元素
1) "crystalnew"
2) "crystal"
127.0.0.1:6379> 

3)srem:删除set中指定的元素,rem即remove的缩写
例如:删除myset1中的crystal元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
2) "crystal"
127.0.0.1:6379> SREM myset1 crystal      #删除成功,返回1
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
127.0.0.1:6379> SREM myset1 crystal      #因为crystal已经被删除了,所以这里不会删除成功,就返回0
(integer) 0
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
127.0.0.1:6379> 

4)spop:随机返回并删除set中名称为key的一个元素
例如:随机删除myset1中的某个元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "crystal2"
2) "crystal3"
3) "crystal"
4) "crystalnew"
127.0.0.1:6379> SPOP myset1  #第一次删除了crystal2
"crystal2"
127.0.0.1:6379> SMEMBERS myset1     
1) "crystal3"
2) "crystal"
3) "crystalnew"
127.0.0.1:6379> SPOP myset1     #第二次删除了crystal
"crystal"
127.0.0.1:6379> SMEMBERS myset1     #从前面两次删除的数据看,删除的元素是随机删除的,没有规律性
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379> 

5)sdiff:返回两个指定集合的差集(即返回所有给定key与第一个key的差集)
例如:求myset1和myset3之间的差集(以写在前面的key为标准)

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SDIFF myset1 myset3
1) "one"            #备注:从myset1的第一个值开始和myset3比较,第一个不相同的值是one,这个是以myset1作为参照物的。如果myset3在前面,返回的就应该是two
127.0.0.1:6379> 
127.0.0.1:6379> SDIFF myset3 myset1
1) "two"        #如上面的备注,因为myset3在前面,myset3就是参照物,返回的就是和myset3不同的值
127.0.0.1:6379> 

6)sdiffstore:返回所有给定key与第一个key的差集,并将结果存为另一个key(也就是说,sdiff只能返回差集,但是不能把结果存下来,sdiffstore就能将返回的差集存下来)
例如:将上面例子中,myset1和myset3的差集并存储到myset4里面

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SDIFF myset1 myset3
1) "one"
127.0.0.1:6379> SDIFFSTORE myset4 myset1 myset3   #将myset1和myset3的差集并存储到myset4里面
(integer) 1
127.0.0.1:6379> SMEMBERS myset4
1) "one"    #返回的是one,就是myset和myset3的差集
127.0.0.1:6379> 

7)sinter:返回所有给定key的交集
例如:取myset1和myset3之间的交集

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SINTER myset1 myset3
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379> 

8)sinterstore:返回所有给定key的交集,并将结果存为另一个key
例如:将上面例子中myset1和myset3的交集取出,并存储到myset5中

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SINTER myset1 myset3  #取myset1和myset3的交集
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379> SINTERSTORE myset5 myset1 myset3   #去交集并存储到myset5中
(integer) 2
127.0.0.1:6379> SMEMBERS myset5   #查看myset5的值,就是myset1和myset3的交集
1) "crystalnew"
2) "crystal3"
127.0.0.1:6379> 

9)sunion:返回所有给定key的并集
例如:返回myset1和myset3的并集

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SUNION myset1 myset3  #取并集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> 

10)sunionstore:返回所有给定key的并集,并将结果存为另一个key
例如:将上面例子中myset1和myset3的并集取出,并存储到myset6中

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SUNION myset1 myset3   #取并集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> SUNIONSTORE myset6 myset1 myset3   #取并集并存储到myset6中
(integer) 4
127.0.0.1:6379> SMEMBERS myset6   #查看myset6的值,就是myset1和myset3的并集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> 

11)smove:从第一个key对应的set中移除member并添加到第二个对应的set中
例如:将myset6里面crystalnew元素移动到myset7里面

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset6    #查看myset6当前的元素
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> SMEMBERS myset7      #myset7当前为空,没有任何元素
(empty list or set)
127.0.0.1:6379> SMOVE myset6 myset7 crystalnew      #将myset6里面crystalnew元素移动到myset7里面
(integer) 1
127.0.0.1:6379> SMEMBERS myset6     #myset6里面已经没有了crystalnew这个元素
1) "one"
2) "crystal3"
3) "two"
127.0.0.1:6379> SMEMBERS myset7     #myset7里面已经非空,有个crystalnew这个元素
1) "crystalnew"
127.0.0.1:6379> 

12)scard:返回指定key的set的元素个数
例如:返回myset1的元素个数

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1    #先查看当前myset1的元素详情
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SCARD myset1        #scar查看myset1的元素个数
(integer) 3
127.0.0.1:6379> 

13)sismember:测试member是否是名称为key的set的元素
例如:测试元素“one”和元素“two”是否为myset1里面的元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SISMEMBER myset1 one   #测试one是否为myset1的元素
(integer) 1             #因为one是myeset1里的元素,所以返回1
127.0.0.1:6379> SISMEMBER myset1 two    #测试two是否为myset1的元素
(integer) 0            #因为two不是myeset1里的元素,所以返回0
127.0.0.1:6379> 

14)srandmember:随机返回名称为key的set的一个元素,但是不删除元素(即随机取指定set里面的某个元素,而且不删除)
例如:随机取myset1里面的某个元素

[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1         #查看myset1当前所有元素
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SRANDMEMBER myset1      #第一次随机获取,得到的是元素crystal3
"crystal3"
127.0.0.1:6379> SMEMBERS myset1  
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SRANDMEMBER myset1   #第二次随机获取,得到的是元素crystalnew3
"crystalnew"
127.0.0.1:6379> SMEMBERS myset1     #查看myset1当前所有元素,还是原来的元素,并没有被删除
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> 

转载于:https://blog.51cto.com/10950710/2163363

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值