有序集合是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