redis集合类型详解

作者: 闲睡猫 | 来源:发表于2017-12-12 10:32 被阅读60次

    集合(set)类型也是用于保存多个的字符串元素,但也列表不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素

    redis除了支持集合内的增删改查,同时还支持多个集合取交集,并集,差集

    集合内操作

    添加元素

    sadd key element [element ...]

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

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

    删除元素

    srem key element [element ...]

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

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

    计算元素个数

    scard key

    127.0.0.1:6379> scard myset
    (integer) 1
    

    判断元素是否在集合中

    sismember key element

    如果元素存在返回1,不存在返回0

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

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

    srandmember key [count]

    [count]默认为1

    127.0.0.1:6379> sadd myset a b c d e f g
    (integer) 6
    127.0.0.1:6379> srandmember myset 2
    1) "d"
    2) "e"
    127.0.0.1:6379> srandmember myset
    "f"
    

    从集合随机弹出元素

    spop key

    从集合中随机弹出一个元素

    127.0.0.1:6379> spop myset
    "b"
    127.0.0.1:6379> spop myset
    "g"
    

    srandmember和spop都是随机从集合选出元素,不同之处在于,spop会将元素从集合中弹出

    获取所有元素

    smembers key

    返回的结果是无序的

    127.0.0.1:6379> smembers myset
    1) "d"
    2) "c"
    3) "e"
    4) "a"
    5) "f"
    

    smembers和lrange, hgetall都属于比较重的命令,如果元素过多,有可能阻塞

    集合间操作

    创建两个集合

    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 ent sports
    (integer) 4
    

    求集合间交集

    sinter key [key ...]

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

    求多个集合的并集

    suinon key [key ...]

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

    求多个集合的差集

    sdiff key [key ...]

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

    保存集合运算的结果

    集合的运算过程是比较耗时的,如果需要重复用到运算结果,就很有必要将结果存储起来。以下命令将集合间的交集、并集、差集结果保存到另一个集合中

    sinterstore destination key [key ...]
    suionstore destination key [key ...]
    sdiffstore destination key [key ...]

    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) "it"
    2) "sports"
    
    127.0.0.1:6379> sunionstore user:1_2:union user:1:follow user:2:follow
    (integer) 6
    127.0.0.1:6379> smembers user:1_2:union
    1) "ent"
    2) "his"
    3) "it"
    4) "sports"
    5) "news"
    6) "music"
    
    127.0.0.1:6379> sdiffstore user:1_2:diff user:1:follow user:2:follow
    (integer) 2
    127.0.0.1:6379> smembers user:1_2:diff
    1) "his"
    2) "music"
    

    时间复杂度

    集合类型命令时间复杂度

    应用场景

    集合类型的典型应用场景是标签。如文章标签:一篇文章可以有多个标签,每个标签都不相同,不同文章的标签可相同,也可不同。文章之间可能标签可以进行归类筛选

    同理,社交或电商网站给用户添加标签(兴趣、爱好等),也是集合的经典应用场景

    相关文章

      网友评论

        本文标题:redis集合类型详解

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