Redis开发与运维读书笔记之八

第2章 API的理解和使用 第6部分

有序集合zset

有序集合 不能有重复成员,元素可以排序,和列表的索引下标不同, 排序依据的是分数(score),分数可以重复。提供获取 指定分数和元素范围查询、计算成员排名等功能。

数据结构 是否允许重复元素 是否有序 有序实现方式 应用场景
列表 索引下标 时间轴、消息队列等
集合 标签、社交等
有序集合 分数 排行榜、社交等

命令
1、集合内
[list]
  • 添加成员
  • zadd key score member [score member ...]

    zadd有nx、xx、ch、incr是个选项:
    nx:用于新增,member必须不存在
    xx:用于更新,member必须存在
    ch:返回zadd操作后,有序集合元素和分数发生变化的个数
    incr:对score做增加,相当于zincrby命令
    zadd的时间复杂度是O(log(n)),而sadd时间复杂度是O(1)
  • 计算成员个数
  • zcard key
  • 计算某个成员的分数
  • zscore key member
  • 计算成员的排名
  • zrank key member
    zrevrank key member

    zrank是从分数低到高返回成员的排名,zrevrank则反之
  • 删除成员
  • zrem key member [member ...]
  • 增加成员的分数
  • zincrby key increment member
  • 返回指定排名范围的成员
  • zrange key start end [withscores]
    zrevrange key start end [withscores]

    加上withscores会同时返回成员的分数
  • 返回指定分数范围的成员
  • zrangebyscore key min max [withscores] [limit offset count]
    zrevrangebyscore key min max [withscores] [limit offset count]

    withscores会同时返回成员的分数
    [limit offset count]限制输出的起始位置和个数
    min和max支持开区间(小括号)和闭区间(中括号),-inf和+inf分别表示无限小和无限大
  • 返回指定分数范围成员个数
  • zcount key min max
  • 删除指定排名内的升序元素
  • zremrangebyrank key start end
  • 删除指定分数范围的成员
  • zremrangebyscore key min max

    [/list]
    2、集合间
    [list]
  • 交集
  • zinterstore destination numkeys key [key...] [weights weight [weight ...]] [aggregate sum|min|max]

    destination:交集计算结果保存的键
    numkeys:需要做交集计算键的个数
    key [key ...]:需要做交集计算的键
    weights weight [weight ...]:每个键的权重,默认为1,计算时,键中的每个member会将分数乘以权重,每个weight对应上面的每个key
    aggregate sum|min|max:计算成员交集后,分值可以按照sum、min、max做汇总,默认为sum
  • 并集
  • zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggreagate sum|max|min]

    [/list]

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


    使用场景
    有序集合主要用于排行榜系统,可以按照不同维护进行排行,如时间、播放数量、获得赞数等。
    如对于获得赞数,记录用户每天上传视频的排行榜,包括以下几块功能:
    [list]
  • 添加用户赞数
  • 通过zadd和zincrby记录,william上传视频获得3个赞,然后又获得了1个赞
    zadd user:ranking:2017_07_07 william 3
    zincreby user:ranking:2017_07_07 william 1
    
  • 取消用户赞数
  • 将用户william从榜单上删除
    zrem user:ranking:2017_07_07 william
  • 展示获取赞数最多的10个用户
  • zrevrangebyrank user:ranking:2017_07_07 0 9
  • 展示用户分数
  • zscore user:ranking:2017_07_07 william
    zrank user:ranking:2017_07_07 william

    [/list]

    猜你喜欢

    转载自xwhuang.iteye.com/blog/2379144