1. 程式人生 > >Redis自學筆記:3.6入門-有序集合型別

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