美文网首页
Redis学习笔记【07】 - 集合

Redis学习笔记【07】 - 集合

作者: 四月不见 | 来源:发表于2018-08-20 14:42 被阅读2次

    一、简介

    集合(set)也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合可以存储2^32 - 1个元素。


    Redis除了支持集合内的增删查改,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。

    二、命令

    1、集合内操作

    1)添加元素

    sadd key element [element ...]
    

    返回结果为添加成功的元素个数,如:

    127.0.0.1:6379> exists myset
    (integer) 0
    127.0.0.1:6379> sadd myset a b c
    (integer) 3
    127.0.0.1:6379> sadd myset a b
    (integer) 0
    

    2)删除元素

    srem key element [element ...]
    

    返回结果为成功删除元素个数,如:

    127.0.0.1:6379> srem myset a b
    (integer) 2
    127.0.0.1:6379> srem myset hi
    (integer) 0
    

    3)计算元素个数

    scard key
    

    scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用Redis内部的变量,如:

    127.0.0.1:6379> scard myset
    (integer) 1
    

    4)判断元素是否在集合中

    sismember key element
    

    如果给定元素element在集合内返回1,反之返回0,如:

    127.0.0.1:6379> sismember myset c
    (integer) 1
    127.0.0.1:6379> sismember myset d
    (integer) 0
    

    5)随机从集合中返回指定个数元素

    srandmember key [count]
    

    [count]是可选参数,如果不选默认为1,如:

    127.0.0.1:6379> sadd myset a b c
    (integer) 3
    127.0.0.1:6379> srandmember myset 2
    1) "b"
    2) "c"
    127.0.0.1:6379> srandmember myset
    "a"
    

    6)从集合随机弹出元素

    spop key
    

    如:

    127.0.0.1:6379> spop myset
    "b"
    127.0.0.1:6379> smembers myset
    1) "a"
    2) "c"
    

    需要注意的是Redis从3.2版本开始,spop也支持[count]参数。
    srandmember和spop都是随机从集合选出元素,两者不同的是spop命令执行后,元素会从集合中删除,而srandmember不会。

    7)获取所有元素

    smembers key
    

    下面代码获取集合myset所有元素,并且返回结果是无序的:

    127.0.0.1:6379> smembers myset
    1) "a"
    2) "c"
    

    2、集合间操作

    现在有两个集合,它们分别是user:1:follow和user:2:follow:

    127.0.0.1:6379> sadd user:1:follow it music his sports
    (integer) 4
    127.0.0.1:6379> sadd user:2:follow it news end sports
    (integer) 4
    
    

    1)求多个集合的交集

    sinter key [key ...]
    

    如:

    127.0.0.1:6379> sinter user:1:follow user:2:follow
    1) "sports"
    2) "it"
    

    2)求多个集合的并集

    sunion key [key ...]
    

    如:

    127.0.0.1:6379> sunion user:1:follow user:2:follow
    1) "end"
    2) "sports"
    3) "his"
    4) "music"
    5) "news"
    6) "it"
    

    3)求多个集合的差集

    sdiff key [key ...]
    

    如:

    127.0.0.1:6379> sdiff user:1:follow user:2:follow
    1) "music"
    2) "his"
    

    4)将交集、并集、差集的结果保存

    sinterstore destination key [key ...]
    sunionstore destination key [key ...]
    sdiffstore destination key [key ...]
    

    集合间的运算在元素较多的情况会比较耗时,所以Redis提供了上面三个命令(原命令+store)将集合间交集、并集、差集的结果保存在destination中,例如下面操作将user:1:follow和user:2:follow两个集合的交集结果保存在user:1_2:inter中,user:1_2:inter本身也是集合类型:

    127.0.0.1:6379> sinterstore user:1_2:inter user:1:follow user:2:follow
    (integer) 2
    127.0.0.1:6379> type user:1_2:inter
    set
    127.0.0.1:6379> smembers user:1_2:inter
    1) "sports"
    2) "it"
    

    三、集合常用命令时间复杂度

    命令 时间复杂度
    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(count)
    spop key O(1)
    smembers key O(n),n是元素总数
    sinter key [key ...] 或 sinterstore O(m*k),k是多个集合中元素最少的个数,m是键个数
    sunion key [key ...] 或 sunionstore O(k),k是多个集合元素个数和
    sdiff key [key ...] 或 sdiffstore O(k),k是多个集合元素个数和

    参考:

    《Redis开发与运维》 付磊 & 张益军

    相关文章

      网友评论

          本文标题:Redis学习笔记【07】 - 集合

          本文链接:https://www.haomeiwen.com/subject/hgwabftx.html