Redis-Redis實戰(有序集合)

Olge發表於2016-11-09

有序集合是Redis提供的又一種資料型別。與集合相比,很明顯它增加了排序功能,除了基本的 新增 刪 改 差 判斷是否存在等操作外,有序集合還提供了排序、獲取TopN、按Range獲取等操作。

有序集合的底層實現與集合相同,利用雜湊表來實現,同時,有序集合通過給集合中的每一個元素管理一個分數來實現排序。

有序集合的操作

zadd key score1 member1 score2 member2.. #新增元素(分數會覆蓋)
zscore key member  #獲取元素的分數
zrange key start end [withscores] #按分數範圍獲取元素(小->大)
zrevrange key start end [withscores]#按分數返回獲取資料(大->小)
zrangebyscore key min max [withscore] [limit offset count]
zincrby key increment member  #增加元素的分數
zcard key    #獲取集合元素的個數
zcount key min max  #獲取某個範圍內元素的個數
zrem key member1 member2..  #刪除元素
zremrangebyrank key start end #按排名範圍刪除元素
zremrangebyscore key start end  #按分數範圍刪除元素
zrank key member   #獲取元素的排名
zrevrank ky member   #獲取元素排序(倒序)

命令

127.0.0.1:6379> zadd z1 100 Tom 87 Pater 89 Divad
(integer) 3
127.0.0.1:6379> zadd z1 98 Tom
(integer) 0
127.0.0.1:6379> zscore z1 Tom
"98"
127.0.0.1:6379> zrange z1 0 100
1) "Pater"
2) "Divad"
3) "Tom"
127.0.0.1:6379> zrevrange z1 0 100
1) "Tom"
2) "Divad"
3) "Pater"
127.0.0.1:6379> zrange z1 0 100 withscores
1) "Pater"
2) "87"
3) "Divad"
4) "89"
5) "Tom"
6) "98"
127.0.0.1:6379> zrevrange z1 0 100 withscores
1) "Tom"
2) "98"
3) "Divad"
4) "89"
5) "Pater"
6) "87"
127.0.0.1:6379> zincrby z1 3 Divad
"92"
127.0.0.1:6379> zincrby z1 3 Divad
"92"
127.0.0.1:6379> zcard z1
(integer) 3
127.0.0.1:6379> zcount z1 0 100
(integer) 3
127.0.0.1:6379> zrem z1 Pater
(integer) 1
127.0.0.1:6379> zrank z1 Tom
(integer) 1
127.0.0.1:6379> zrank z1 Divad
(integer) 0
127.0.0.1:6379> zrank z1 Pater
(nil)
127.0.0.1:6379> 

實踐

1)按點選量對文章排序
要實現這個需求,我們以文章ID作為元素,點選量作為分數,當文章被訪問一次時,將分數+1即可。

posts:page.view pvnum articleId

實現流程如下:

$postPrePage = 10
$start = ($currentPage - 1) * $postPrePage
$end = $currentPage * $postPrePage - 1
$postsIds = zrevrange posts:page.view $start $end
foreach $id in $postsIds
     $postData = hgetall post:$id

相關文章