美文网首页Redis学习
Redis 数据类型及应用场景——Set

Redis 数据类型及应用场景——Set

作者: 十年磨一剑1111 | 来源:发表于2020-03-03 11:28 被阅读0次

    说到集合大家可能会联想到数学里面的那个集合,我们用一个集合来存储具有某类特性的多个数据,比如整数集合,有理数集合等等,多个集合可以求交集,差集还有并集等,那我们今天要聊的是redis里面一种数据结构——集合,它也有着类型特征和操作。

    1. Set简介

    在集合中的每个元素都是不同的,并且没有顺序。一个集合类型的键最多能存储2^32-1(我们发现hash,list 都是一样的)个字符串。在Redis的内部是使用hashtable或者intset来实现的,所以当我们去查找或者更新数据的时候时间是很快的,时间复杂度为O(1),另外多个集合简可以进行交集,差集和并集操作。

    2. 常用操作命令

    (1) 增加/删除元素

    sadd numbers1 1 2 3; //向集合中添加元素,如果集合numbers不存在则创建一个新的。
    srem numbers1 1;//删除元素1
    smembers numbers1;//获取集合中的所有元素
    

    下面我用一张图来展示下


    集合操作.png

    (2) 判断元素是否在集合中

    sismember key member;
    

    (3)集合间的运算

    sdiff key    [key ...];//多个集合间的差集
    sinter key  [key ...];//多个集合间的交集
    sunion key [key ...];//多个集合间的并集
    

    下面展示几张图:


    A-B差集.png
    A和B的交集.png
    A和B的并集.png

    看了这几张图后,我们发现集合间的运算其实是很简单的,那具体的一些操作命令这里就不做更多的展示了。
    (4) 其他的一些操作

    scard key;//获取集合中的元素个数
    srandmember key;//随机获取集合中的元素,返回的数据不是很随机。
    spop key;//从集合中弹出一个元素
    

    3. 实践

    (1) 标签
    比如文章的标签,考虑到一个文章的所有标签都是不相同的,而且展示的时候对这些标签的顺序并没有要求,我们可以使用集合来存储文章标签。使用集合存储标签我们还可以单独增加(sadd)或者删除(srem)标签,当然,如果你的业务是不需要针对单个标签操作,那我们也可以使用字符串类型的键来保存标签。
    (2)社交
    因为set它具有唯一性以及不同集合间的运算我们可以使用它来存储好友/关注/粉丝/感兴趣的人的集合。
    a. sinter命令可以获取不同用户间的共同好友.
    b. sismember命令可以判断A是否是B的好友.
    c. scard命令可以获取好友的数量.
    不过需要注意一点的是向sinter,smove(本文没有介绍)等操作多个key的命令在集群环境下是不太合适的,因为这种操作多个key的命令需要要求这几个key存储在同一个slot(槽位)中,至于数据存储在哪个slot中是根据key然后通过一个算法计算得到,也就是在没有其他办法的情况下,我们只能让两个key值一样,显然,这个办法是行不通的。 但是有同学可能想到redis 有个hash tag 的东西,也就是redis只对{}大括号括起来的部分键名进行hash运算,比如某个用户的好友集合friend_set:{user:678},粉丝列表fans_set:{user:678},如果我们将这两个集合进行运行是可以的;再看个不可以的例子,如果是不同的用户呢?那我们只能这样设置键{friend_set}:user:678,{fans_set}:user:906,那这样一来就是所有的用户数据都放在了同一个slot内,数据分布会严重不均匀。
    (3) 随机获取
    比如app的首页要随机展示几篇文章,那我们可以事先确定一批需要展示的文章保存到集合中,然后利用srandmember 这个命令从集合中随机取几篇文章,不过要注意一点的是srandmember命令返回的数据其实不是很随机,这个主要是有set类型的存储结构决定的。
    (4)黑名单/白名单
    在实际应用中出于一些安全或者业务需求我们需要对某些特殊的数据做特殊处理,比如用户黑名单,ip黑名单,设备黑名单等等,我们可以利用sismember命令判断用户,ip,设备是否在黑名单中。

    相关文章

      网友评论

        本文标题:Redis 数据类型及应用场景——Set

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