设为首页 收藏本站
查看: 502|回复: 0

[经验分享] 系统学习redis之六——redis数据类型之set数据类型及操作

[复制链接]

尚未签到

发表于 2018-11-2 07:58:24 | 显示全部楼层 |阅读模式
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>



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629585-1-1.html 上篇帖子: 系统学习redis之五——redis数据类型之list类型及操作 下篇帖子: redis清除缓存方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表