• redis 简单整理——redis 的有序集合基本结构和命令[六]


    前言

    简单介绍一下redis的有序集合的基本结构和命令。

    正文

    有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序 集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性, 但不同的是,有序集合中的元素可以排序。

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

    有序集合包含kris、mike、frank、tim、martin、tom, 它们的分数分别是1、91、200、220、250、251,有序集合提供了获取指定 分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助 我们在实际开发中解决很多问题。

    注意:

    有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。
    

    那么下面就来介绍其中的命令吧。

    zadd key score member [score member ...]
    

    注意点:

    ·Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:
    
     ·nx:member必须不存在,才可以设置成功,用于添加。
    
     ·xx:member必须存在,才可以设置成功,用于更新。 
    
     ·ch:返回此次操作后,有序集合元素和分数发生变化的个数
    
     ·incr:对score做增加,相当于后面介绍的zincrby
    

    性能:

    有序集合相比集合提供了排序字段,但是也产生了代价,zadd的时间 复杂度为O(log(n)),sadd的时间复杂度为O(1)。
    

    zcard key 计算成员个数:

    zscore 获取某个成员的权重:

    如果不存在返回为空:

    zrank 表示从低到高排序,从0开始的:

    zrevrank 表示从高到底排序,从0开始的:

    zrem key member 删除某个成员:

    给某个值增加权重:

    返回指定排名的成员:

    如果加上withscores 还会返回分数:

    zrevrange 自然就是从高到底排序,然后取出部分。

    zrangebyscore key min max [withscores] [limit offset count] 
    
    zrevrangebyscore key max min [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...]:需要做交集计算的键。139
    ·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]
    

    复杂度:

    内部编码

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

    使用场景

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

    下面用点赞数排行作为例子:

    1.例如用户mike上传了一个视频,并获得了3个赞,可以使用有序集合的 zadd和zincrby功能

    zadd user:ranking:2016_03_15 mike 3
    

    如果之后再获得一个赞,可以使用zincrby:

    zincrby user:ranking:2016_03_15 mike 1
    

    2.由于各种原因(例如用户注销、用户作弊)需要将用户删除,此时需要 将用户从榜单中删除掉,可以使用zrem。例如删除成员tom:

    zrem user:ranking:2016_03_15 mike
    

    3.展示获取赞数最多的十个用户 此功能使用zrevrange命令实现:

    zrevrangebyrank user:ranking:2016_03_15 0 9
    
    1. 此功能将用户名作为键后缀,将用户信息保存在哈希类型中,至于用户 的分数和排名可以使用zscore和zrank两个功能:
    hgetall user:info:mike
    zscore user:ranking:2016_03_15 mike
    zrank user:ranking:2016_03_15 mike
    

    下一节,键管理。

  • 相关阅读:
    NET开发中的事务处理大比拼
    gridview 导出Excel
    项目 心得
    设计模式Prototype原型模式
    设计模式Memento 备忘录模式
    设计模式Chain Of Responsibility 职责链模式
    设计模式Composite组合模式
    .NET常用功能和代码[总结与收藏]
    SQL SERVER函数——表值函数的处理
    设计模式学习笔记 简单工厂模式
  • 原文地址:https://www.cnblogs.com/aoximin/p/15144179.html
Copyright © 2020-2023  润新知