zoukankan      html  css  js  c++  java
  • Redis自学笔记:3.6入门-有序集合类型

    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用法类似

  • 相关阅读:
    5-python基础—获取某个目录下的文件列表(适用于任何系统)
    Automated, Self-Service Provisioning of VMs Using HyperForm (Part 1) (使用HyperForm自动配置虚拟机(第1部分)
    CloudStack Support in Apache libcloud(Apache libcloud中对CloudStack支持)
    Deploying MicroProfile-Based Java Apps to Bluemix(将基于MicroProfile的Java应用程序部署到Bluemix)
    Adding Persistent Storage to Red Hat CDK Kit 3.0 (在Red Hat CDK Kit 3.0添加永久性存储)
    Carve Your Laptop Into VMs Using Vagrant(使用Vagran把您笔记本电脑刻录成虚拟机)
    使用Python生成一张用于登陆验证的字符图片
    Jupyter notebook的安装方法
    Ubuntu16.04使用Anaconda5搭建TensorFlow使用环境 图文详细教程
    不同时区的换算
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10206992.html
Copyright © 2011-2022 走看看