3.6有序集合类型

3.6.1介绍

在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得
分数最高(最低)的前N个元素,可以获得指定范围内的元素等

  • 有序集合中每个元素不同,但它们的分数却可以相同

有序集合和列表相同点:

  1. 都是有序的
  2. 都可以获得某一范围元素
    有序集合和列表区别:
  3. 列表是通过双链表实现的
    有序集合是使用散列表和跳跃表实现的
  4. 列表中不能简单地调整某个元素
    但是集合可以(通过更改这个元素的分数)
  5. 有序集合要比列表更耗费内存

3.6.2命令

  1. 增加元素
    zadd key score member [score member ...]

    • 如果该元素已经存在会用新的分数替换原有的分数
      127.0.0.1:6379> zadd foo 89 tom 67 peter 100 david 3 127.0.0.1:6379> zadd foo 76 peter 0
    • +inf和-inf分别表示正无穷和负无穷
  2. 获得元素的分数
    zscore key member
    127.0.0.1:6379> zscore foo tom 89
  3. 获得排名在某个范围的元素列表
    zrange key start stop [withscores]
    按照元素分数从小到大顺序返回索引从start到stop之间的所有元素
    时间复杂度为O(log n+m)
    zrevrange key start stop [withscores]
    按照元素分数从大到小顺序返回索引从start到stop之间的所有元素
    127.0.0.1:6379> zrange foo 0 2 peter tom david 127.0.0.1:6379> zrevrange foo 0 -1 david tom peter 127.0.0.1:6379> zrange foo 0 -1 withscores peter 76 tom 89 david 100

    • withscores表示返回元素的分数
  4. 获得指定分数范围的元素
    zrangebyscore key min max [withscores] [limit offset count]
    127.0.0.1:6379> zrangebyscore foo 80 100 tom david 127.0.0.1:6379> zrangebyscore foo 80 (100 tom

    • (100 表示不包含100
      127.0.0.1:6379> zrangebyscore foo (80 +inf tom david
    • 不知道最高分上限,获得80分以上的
      127.0.0.1:6379> zrangebyscore bar 2 6 withscores limit 0 1 b 2
    • limit offset count:跳过offset条,显示count条,类似SQL里面语句
  5. 增加某个元素的分数
    zincrby key increment member
    增加一个元素分数(increment为负数时即为减)
    127.0.0.1:6379> zscore foo tom 89 127.0.0.1:6379> zincrby foo 5 tom 94 127.0.0.1:6379> zscore foo tom 94

    • 如果元素不存在,redis会先建立并将它的分数赋为0,再执行操作

3.6.3实践

  1. 实现点击率排序
    以文章的ID作为元素,该文章的点击量作为该元素的分数.
    该键命名为posts:page.view,每次用户访问一篇文章,博客程序就通过
    zincrby posts:page.view 1 文章ID更新访问量
    需要按照点击量的顺序显示文章列表时,伪代码:
    $postsPerPage = 10 $start = ($currentPage-1) * $postsPerPage $end = $current * $postsPerPage - 1 $postsID = zrevrange posts:page.view, $start, $end for each $id in $postsID $postData = hgetall post:$id print 文章标题: $postData.title

    • 注:3.2介绍的字符串类型post:文章ID:page.view这个键不需要了
  2. 改进时间排序
    为了能够自由更改文章发布时间(3.4节posts:list),可以采用有序集合类型
    代替列表类型.元素是文章ID,分数是Unix时间.

3.6.4命令拾遗

  1. 获得集合中元素数量:zcard key
    127.0.0.1:6379> zadd foo 1 a 2 b 3 c 4 d 4 127.0.0.1:6379> zcard foo 4
  2. 获得指定分数范围内元素:
    zcount key min max
    127.0.0.1:6379> zcount foo 2 3 2
  3. 删除一个或多个元素:
    zrem key member [member ...]
    127.0.0.1:6379> zrem foo a 1 127.0.0.1:6379> zrem foo d f b 2
  4. 按照排名范围删除元素
    zremrangebyrank key start stop
    127.0.0.1:6379> zadd foo 1 a 2 b 3 c 4 d 5 g 6 f 6 127.0.0.1:6379> zremrangebyrank foo 0 2 3 127.0.0.1:6379> zrange foo 0 -1 d g f
  5. 按照分时范围删除元素
    zremrangebyscore key min max
    127.0.0.1:6379> zremrangebyscore foo 5 6 2 127.0.0.1:6379> zrange foo 0 -1 d
  6. 获得元素的排名
    zrank key member
    升序时候的排名
    zrevrank key member
    降序时候排名
    127.0.0.1:6379> zadd foo 33.3 a 99.9 b 72 c 88 d 21.333 f 5 127.0.0.1:6379> zrank foo b 4 127.0.0.1:6379> zrevrank foo b 0
  7. 计算有序集合交集
    zinterstore destination numkey key [key...]
    [weights weight [weight...]] [aggregate sum|min|max]

    ①当aggregate为sum时(默认)
    127.0.0.1:6379> zadd foo 1 a 2 b 3 c 3 127.0.0.1:6379> zadd bar 1 a 2 c 3 f 3 127.0.0.1:6379> zinterstore fred 2 foo bar 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 2 c 5
    ②当aggregate为min时
    127.0.0.1:6379> zinterstore fred 2 foo bar aggregate min 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 1 c 2
    ③当aggregate为max时
    127.0.0.1:6379> zinterstore fred 2 foo bar aggregate max 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 1 c 3
    ④weights设置每个集合的权重,每个集合在参与计算是元素的分数会被乘上
    该集合的权重
    127.0.0.1:6379> zinterstore fred 2 foo bar weights 2 0.5 2 127.0.0.1:6379> zrange fred 0 -1 withscores a 2.5 c 7

  8. 计算有序集合并集
    zunionstorezinterstore用法类似

Redis自学笔记:3.6入门-有序集合类型的更多相关文章

  1. Redis自学笔记:3.3入门-散列类型

    3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...

  2. Redis自学笔记:3.5入门-集合类型

    3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...

  3. Redis自学笔记:3.2入门-字符串类型

    3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...

  4. Redis学习笔记(六)有序集合进阶

    1.基础操作 ZCARD(获取成员数量) ZINCRBY key_name num member(将member的分数加num) ZCOUNT key_name min max(获取分数在min与ma ...

  5. Redis自学笔记:3.4入门-列表类型

    3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...

  6. Redis自学笔记:3.1入门-热身

    第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...

  7. Redis自学笔记 --Hash、List、Set类型简述

    Hash类型                                                                                    hset key f ...

  8. Redis 常用命令学四:有序集合类型命令

    1.增加元素,修改存在元素的分数 127.0.0.1:6379> zadd score 99 a 88 b 66 c (integer) 3 127.0.0.1:6379> ZADD sc ...

  9. Redis常用命令入门5:有序集合类型

    有序集合类型 上节我们一起学习了集合类型,感受到了redis的强大.现在我们接着学Redis的最后一个类型——有序集合类型. 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序 ...

随机推荐

  1. 《剑指offer》 包含min函数的栈

    本题来自<剑指offer> 包含min函数的栈 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 思路: 举例子让抽象问题具体 ...

  2. light1370 欧拉函数打表

    /* 给定n个数ai,要求欧拉函数值大于ai的最小的数bi 求sum{bi} */ #include<bits/stdc++.h> using namespace std; #define ...

  3. 性能测试四十八:Jenkins+Ant+Jmeter系统部署

    工作步骤: 1.开发提交代码SVN/Git 2.代码编译.打war包 3.上传war包到服务器 4.重启web服务器 5.开始测试/自动化测试 6.发测试结果 Jenkins工作: 1.开发提交代码G ...

  4. python WebDriver如何处理右键菜单

    WebDriver如何处理右键菜单 一.背景 在学习selenium webdriver的过程中,遇到这样一个问题.ActionChains类中提供了context_click的方法,它可以用来在we ...

  5. 微信小程序--代码构成---WXML 模板

    WXML 模板 从事过网页编程的人知道,网页编程采用的是 HTML + CSS + JS 这样的组合,其中 HTML 是用来描述当前这个页面的结构,CSS 用来描述页面的样子,JS 通常是用来处理这个 ...

  6. ZOJ 3785 What day is that day?(数论:费马小定理)

    What day is that day? Time Limit: 2 Seconds      Memory Limit: 65536 KB It's Saturday today, what da ...

  7. .NET成年了,然后呢?

    作者|Lex Li 编辑|郭蕾 这可能是唯一一篇系统回顾 .NET 发展的文章..NET 的成年礼到了,你会送它什么? 2014 年 11 月 12 日,美国纽约曼哈顿,多云,气温适宜.微软公司执行副 ...

  8. 期货大赛项目|二,DAL详解

    接口层就不重点讲述了,直接DAL层 DAL层 using System; using System.Collections.Generic; using System.Linq; using Syst ...

  9. alpha冲刺2/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:拿快递也不能耽搁了软工 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 github代码管理规范 商家端订单 ...

  10. [转]安卓手机google商店的账号切换退出方式

    来源:http://blog.csdn.net/bianchengninhao/article/details/42240839 1.设置 2.账户 3.Google 4. 5.点击菜单键 6.最后删 ...