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

  • 相关阅读:
    JS 缓存
    时区转换
    JQuery easy UI 通过updateRow 排序
    SqlServer2008 数据库同步的两种方式
    C#各种辅助类收集(CSharpCommonHelper)
    Doc命令收集(一)
    Sql Server Alter语句
    JQuery easy UI updateRow
    Doc命令收集(二)
    六大开源搜索引擎工具
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10206992.html
Copyright © 2011-2022 走看看