• Redis数据结构---有序集合


    有序集合保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。

    有序集合和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score) 作为排序的依据。

    列表、 集合、 有序集合三者的异同点

    常用命令

    集合内
    添加成员
    zadd key score member [score member ...] [nx|xx|ch|incr]
    ·nx: member必须不存在, 才可以设置成功, 用于添加。
    ·xx: member必须存在, 才可以设置成功, 用于更新。
    ·ch: 返回此次操作后, 有序集合元素和分数发生变化的个数
    ·incr: 对score做增加, 相当于后面介绍的zincrby。
    
    计算成员个数
    zcard key
    
    计算某个成员的分数
    zscore key member
    
    计算成员的排名
    zrank key member    从分数从低到高返回排名
    zrevrank key member  从分数从高到低返回排名
    
    删除成员
    zrem key member [member ...]
    
    增加成员的分数
    zincrby key increment member
    
    返回指定排名范围的成员
    zrange key start end [withscores]
    zrevrange key start end [withscores]
    有序集合是按照分值排名的, zrange是从低到高返回, zrevrange反之
    
    返回指定分数范围的成员
    zrangebyscore key min max [withscores] [limit offset count]
    zrevrangebyscore key max min [withscores] [limit offset count]
    其中zrangebyscore按照分数从低到高返回, zrevrangebyscore反之。
    ·withscores选项会同时返回每个成员的分数。 
    ·limit offset count选项可以限制输出的起始位置和个数
    
    返回指定分数范围成员个数
    zcount key min max
    
    删除指定排名内的升序元素
    zremrangebyrank key start end
    
    删除指定分数范围的成员
    zremrangebyscore key min max
    
    
    
    集合间的操作
    交集
    zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
    ·destination: 交集计算结果保存到这个键。
    ·numkeys: 需要做交集计算键的个数。
    ·key[key...]: 需要做交集计算的键。
    ·weights weight[weight...]: 每个键的权重, 在做交集计算时, 每个键中的每个member会将自己分数乘以这个权重, 每个键的权重默认是1。
    ·aggregate sum|min|max: 计算成员交集后, 分值可以按照sum( 和) 、min( 最小值) 、 max( 最大值) 做汇总, 默认值是sum。
    
    并集
    zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
    参数和zinterstore参数一致

    时间复杂度

    内部编码

    有序集合类型的内部编码有两种
    ·ziplist(压缩列表) : 当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个) , 同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节) 时, Redis会用ziplist来作为有序集合的内部实现, ziplist可以有效减少内存的使用。
    ·skiplist(跳跃表) : 当ziplist条件不满足时, 有序集合会使用skiplist作为内部实现, 因为此时ziplist的读写效率会下降。

    使用场景

    有序集合比较典型的使用场景就是排行榜系统

    例如:视频网站需要对用户上传的视频做排行榜, 榜单的维度可能是多个方面的: 按照时间、 按照播放数量、 按照获得的赞数。 本节使用赞数这个维度, 记录每天用户上传视频的排行榜。

  • 相关阅读:
    C/C++中的堆、栈和队列
    网卡工作状态检测
    Delphi 2007 的midas程序注册问题
    使用SQL语句备份与恢复数据库
    C/C++中的堆、栈和队列
    Delphi 2007 的midas程序注册问题
    如何使用VirtualBox的共享文件夹(转)
    如何使用VirtualBox的共享文件夹(转)
    C语言struct的使用
    printf常用格式
  • 原文地址:https://www.cnblogs.com/MacoLee/p/13970431.html
Copyright © 2020-2023  润新知