Redis-Set

打印 上一主题 下一主题

主题 1766|帖子 1766|积分 5298

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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 …]
  1. redis> sadd myset "Hello"
  2. (integer) 1
  3. redis> sadd myset "World"
  4. (integer) 1
  5. redis>s add myset "World"  //去重操作
  6. (integer) 0
  7. redis> smembers myset     //查看myset中的元素,返回的是元素的值
  8. 1) "Hello"
  9. 2) "World"
复制代码
2.smembers操纵

获取⼀个set中的所有元素,注意,元素间的次序是⽆序的。
下令有效版本:1.0.0之后
时间复杂度:O(N)
返回值:所有元素的列表。
语法:smembers key
代码如下(示例):
  1. redis> sadd myset "Hello"   //添加元素
  2. (integer) 1
  3. redis> sadd myset "World"
  4. (integer) 1
  5. redis> smembers myset   //获取元素
  6. 1) "Hello"
  7. 2) "World"
复制代码
3.sismember操纵

判定⼀个元素在不在set中。
下令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:1表⽰元素在set中。0表⽰元素不在set中大概key不存在。
语法: sismember key member
代码如下(示例):
  1. redis> sadd myset "one"
  2. (integer) 1
  3. redis> sismember myset "one"
  4. (integer) 1
  5. redis> sismember myset "two"
  6. (integer) 0
复制代码
4.scard操纵

获取⼀个set的基数(cardinality),即set中的元素个数。
下令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:set内的元素个数。
语法: scard key
代码如下(示例):
  1. redis> sadd myset "Hello"
  2. (integer) 1
  3. redis> sadd myset "World"
  4. (integer) 1
  5. redis> scard myset
  6. (integer) 2
复制代码
5.spop操纵

从set中删除并返回⼀个大概多个元素。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。
下令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:1表⽰元素在set中。0表⽰元素不在set中大概key不存在。
语法: spop key [count]
代码如下(示例):
  1. redis> sadd myset "one"
  2. (integer) 1
  3. redis> sadd myset "two"
  4. (integer) 1
  5. redis> sadd myset "three"
  6. (integer) 1
  7. redis> spop myset
  8. "one"
  9. redis> smembers myset
  10. 1) "three"
  11. 2) "two"
  12. redis> sadd myset "four"
  13. (integer) 1
  14. redis> sadd myset "five"
  15. (integer) 1
  16. redis> spop myset 3
  17. 1) "three"
  18. 2) "four"
  19. 3) "two"
  20. redis> smembers myset
  21. 1) "five"
复制代码
6.smove操纵

将⼀个元素从源set取出并放⼊⽬标set中。
下令有效版本:1.0.0之后
时间复杂度:O(1)
返回值:1表⽰移动成功,0表⽰失败。
语法: smove source destination member
代码如下(示例):
  1. redis> sadd myset "one"
  2. (integer) 1
  3. redis> sadd myset "two"
  4. (integer) 1
  5. redis> sadd myotherset "three"
  6. (integer) 1
  7. redis> smove myset myotherset "two"
  8. (integer) 1
  9. redis> smembers myset
  10. 1) "one"
  11. redis> smembers myotherset
  12. 1) "three"
  13. 2) "two"
复制代码
7.srem操纵

将指定的元素从set中删除。
下令有效版本:1.0.0之后
时间复杂度:O(N),N是要删除的元素个数.
返回值:本次操纵删除的元素个数。
语法: srem key member [member …]
代码如下(示例):
  1. redis> sadd myset "one"
  2. (integer) 1
  3. redis> sadd myset "two"
  4. (integer) 1
  5. redis> sadd myset "three"
  6. (integer) 1
  7. redis> srem myset "one"
  8. (integer) 1
  9. redis> srem myset "four"
  10. (integer) 0
  11. redis> smembers myset
  12. 1) "three"
  13. 2) "two"
复制代码
8.sinter操纵

获取给定set的交会合的元素。
下令有效版本:1.0.0之后
时间复杂度:O(N*M),N是最⼩的聚集元素个数.M是最⼤的聚集元素个数.
返回值:交集的元素。
语法: sinter key [key …]
代码如下(示例):
  1. redis> sadd key1 "a"
  2. (integer) 1
  3. redis> sadd key1 "b"
  4. (integer) 1
  5. redis> sadd key1 "c"
  6. (integer) 1
  7. redis> sadd key2 "c"
  8. (integer) 1
  9. redis> sadd key2 "d"
  10. (integer) 1
  11. redis> sadd key2 "e"
  12. (integer) 1
  13. redis> sinter key1 key2
  14. 1) "c"
复制代码
9.sinterstore操纵

获取给定set的交会合的元素并生存到⽬标set中。(其他聚集操纵也有相关store等操纵,后面不加以赘述)。
下令有效版本:1.0.0之后
时间复杂度:O(N*M),N是最⼩的聚集元素个数.M是最⼤的聚集元素个数.
返回值:交集的元素个数。
语法: sinterstore destination key [key …]
代码如下(示例):
  1. redis> sadd key1 "a"
  2. (integer) 1
  3. redis> sadd key1 "b"
  4. (integer) 1
  5. redis> sadd key1 "c"
  6. (integer) 1
  7. redis> sadd key2 "c"
  8. (integer) 1
  9. redis> sadd key2 "d"
  10. (integer) 1
  11. redis> sadd key2 "e"
  12. (integer) 1
  13. redis> sinterstore key key1 key2
  14. (integer) 1
  15. redis> smembers key
  16. 1) "c"
复制代码
10.sunion操纵

获取给定set的并会合的元素。
下令有效版本:1.0.0之后
时间复杂度:O(N),N给定的所有聚集的总的元素个数.
返回值:并集的元素。
语法: sunion key [key …]
代码如下(示例):
  1. redis> sadd key1 "a"
  2. (integer) 1
  3. redis> sadd key1 "b"
  4. (integer) 1
  5. redis> sadd key1 "c"
  6. (integer) 1
  7. redis> sadd key2 "c"
  8. (integer) 1
  9. redis> sadd key2 "d"
  10. (integer) 1
  11. redis> sadd key2 "e"
  12. (integer) 1
  13. redis> sunion key1 key2
  14. 1) "a"
  15. 2) "c"
  16. 3) "e"
  17. 4) "b"
  18. 5) "d"
  19. 1) "c"
复制代码
11.sdiff操纵

获取给定set的差会合的元素。(不满足交换律)
下令有效版本:1.0.0之后
时间复杂度:O(N),N给定的所有聚集的总的元素个数.
返回值:差集的元素。
语法: sdiff key [key …]
代码如下(示例):
  1. redis> sadd key1 "a"
  2. (integer) 1
  3. redis> sadd key1 "b"
  4. (integer) 1
  5. redis> sadd key1 "c"
  6. (integer) 1
  7. redis> sadd key2 "c"
  8. (integer) 1
  9. redis> sadd key2 "d"
  10. (integer) 1
  11. redis> sadd key2 "e"
  12. (integer) 1
  13. redis> sdiff key1 key2
  14. 1) "a"
  15. 2) "b"
复制代码
三、下令小结操纵

下令时间复杂度sadd key element [element…]O(k),k是元素个数srem key element [element…]O(k),k是元素个数scard keyO(1)sismember key elementO(1)srandmember key[count]O(n),n是countspop key [count]O(n),n是countsmembers keyO(k),k是元素个数sinter key [key…] sitnerstoreO(m*k),k是⼏个聚会合元素最⼩的个数,m是键个数sunion key [key…] sunionstoreO(k),k是多个聚集的元素个数总和sdiff key [key…] sdiffstoreO(k),k是多个聚集的元素个数总和
总结

本文先容了redis中set的有关操纵,并且给出了相应的操纵代码示例,分析了相关操纵的时间复杂度。希望以上内容能帮助各人相识到set的相关知识。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表