Redis自學筆記:3.6入門-有序集合型別
阿新 • • 發佈:2019-01-02
3.6有序集合型別
3.6.1介紹
在集合型別基礎上,為集合中每個元素都關聯了一個分數,故可以獲得
分數最高(最低)的前N個元素,可以獲得指定範圍內的元素等
- 有序集合中每個元素不同,但它們的分數卻可以相同
有序集合和列表相同點:
- 都是有序的
- 都可以獲得某一範圍元素
有序集合和列表區別: - 列表是通過雙鏈表實現的
有序集合是使用散列表和跳躍表實現的
- 列表中不能簡單地調整某個元素
但是集合可以(通過更改這個元素的分數) - 有序集合要比列表更耗費記憶體
3.6.2命令
- 增加元素
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分別表示正無窮和負無窮
- 如果該元素已經存在會用新的分數替換原有的分數
- 獲得元素的分數
zscore key member
127.0.0.1:6379> zscore foo tom 89
- 獲得排名在某個範圍的元素列表
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表示返回元素的分數
- 獲得指定分數範圍的元素
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裡面語句
- (100 表示不包含100
- 增加某個元素的分數
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實踐
- 實現點選率排序
以文章的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
這個鍵不需要了
- 注:3.2介紹的字串型別
- 改進時間排序
為了能夠自由更改文章釋出時間(3.4節posts:list),可以採用有序集合型別
代替列表型別.元素是文章ID,分數是Unix時間.
3.6.4命令拾遺
- 獲得集合中元素數量:
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
- 獲得指定分數範圍內元素:
zcount key min max
127.0.0.1:6379> zcount foo 2 3 2
- 刪除一個或多個元素:
zrem key member [member ...]
127.0.0.1:6379> zrem foo a 1 127.0.0.1:6379> zrem foo d f b 2
- 按照排名範圍刪除元素
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
- 按照分時範圍刪除元素
zremrangebyscore key min max
127.0.0.1:6379> zremrangebyscore foo 5 6 2 127.0.0.1:6379> zrange foo 0 -1 d
- 獲得元素的排名
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
計算有序集合交集
①當aggregate為sum時(預設)
zinterstore destination numkey key [key...]
[weights weight [weight...]] [aggregate sum|min|max]
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
計算有序集合並集
zunionstore
和zinterstore
用法類似