美文网首页
Redis学习笔记:Set类型内部编码及其应用场景

Redis学习笔记:Set类型内部编码及其应用场景

作者: Vechace | 来源:发表于2018-08-11 10:19 被阅读7次

    一、概述

    集合(Set)类型是用来保存多个字符串元素,但是与list类型不停,集合中不允许有重复元素,一个集合最对可以存储2^32-1个元素,Redis除了支持集合内的增删改查,同时还支持多个集合的交并差集操作,合理地使用集合可以在实际开发中解决很多实际问题。

    二、常用命令

    1.集合内操作

    • 添加元素:sadd key element [element ...],返回结果为添加成功的元素个数;
    • 删除元素:srem key element [element ...],返回结果为成功删除的元素个数;
    • 计算元素个数:scard key ,该命令的实际复杂度为O(1),不会遍历集合中所有元素,而是直接使用Redis的内部变量;
    • 判断元素是否在集合中:sismember key element,存在则返回1,否则返回0;
    • 随机从集合中返回指定的个数元素:srandmember key [count]
    • 从集合随机弹出元素:spop key
    • 获取全部元素:smembers key

    2.集合间操作

    • 取交集:sinter key [key ...]
    • 取并集:suinon key [key ...]
    • 取差集:sdiff key [key ...]

    三、内部编码

    集合类型的内部编码有两种:

    • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用;
    • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现;

    在实际开发过程中,合理地设计集合元素类型,并预估元素个数,可以有效减少内存资源的消耗。

    四、使用场景

    集合类型典型的使用场景是标签功能(tag),标签数据对用户体验以及增强用户粘度比较重要(在推荐系统中尤其重要);

    下面简单介绍如何使用集合类型实现标签功能的若干功能:

    1.给用户添加标签:

        sadd user:1:tags  tag1  tag2  tag3
        sadd user:2:tags  tag1  tag2  tag4
        ...
        sadd user:2:tags  tag1  tag2  tag5
    

    2.给标签添加用户:

        sadd tag1:users user:1  user:2
        sadd tag2:users user:1  user:3
        ...
        sadd tag3:users user:1  user:4
    

    3.删除用户下的标签:

        srem  user:1:tags  tag1  tag5
    

    4.计算用户通过感兴趣的标签:

        sinter user:1:tags user:2:tags
    

    备注:在开发过程中,用户和标签的关系维护应该在一个事务里面执行,防止部分命令失败造成数据不一致。

    总结:实际开发一个标签系统远不止以上这些,还有很多复杂的情况需要考虑,不过集合类型的应用场景通常为以下几种:

    • sadd = Tags(标签)
    • spop/srandmember = Random item(生成随机数,抽奖活动/抽卡游戏)
    • sadd + sinter = Social Graph(社交需求)

    感谢阅读~

    参考资料:


    《Redis开发与运维》

    相关文章

      网友评论

          本文标题:Redis学习笔记:Set类型内部编码及其应用场景

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