redis之有序集合类型(Zset)——排行榜的实现
2015-12-24 14:57
736 查看
Redis有序集合和Redis集合类似,是不包含 相同字符串的合集。它们的差别是,每个有序集合 的成员都关联着一个评分,这个评分用于把有序集 合中的成员按最低分到最高分排列。
使用有序集合,你可以非常快地(O(log(N)))完成添加,删除和更新元素的操作。
因为元素是在插入时就排好序的,所以很快地通过评分(score)或者 位次(position)获得一个范围的元素。 访问有序集合的中间元素同样也是非常快的,因此你可以使用有序集合作为一个没用重复成员的智能列表。
在这个列表中, 你可以轻易地访问任何你需要的东西: 有序的元素,快速的存在性测试,快速访问集合中间元素!
简而言之,使用有序集合你可以很好地完成 很多在其他数据库中难以实现的任务。
at first,我们先添加一下数据:
可以看到,有序集合排序的规则是根据分母的大小,分母越小排在集合的前面
如下表显示与排序集的一些基本命令:
http://www.yiibai.com/redis/redis_sorted_sets.html)
我们可以实现的事情:
1.排行榜
排行榜是非常常见的实现,比如收入排行榜,积分排行榜。在某种情况下,可以直接缓存整个排行榜,然后设置定时任务,在某个时间点更新。但对于一些实时性比较强的,需要及时更新数据,可以利用redis的有序队列实现,原理是利用有序队列的关联评分。
PS:如果要自己实现,可以考虑使用二叉堆实现,效率能到到O(log(N))
#假定有一个实时的竞技场评分,在玩家结束操作后打分,并动态显示玩家的排行榜
> zadd rank 100 biki 87 zhibin 72 ming 64 fen 98 cat
(integer) 5
#显示得分最高的前三名玩家
> ZREVRANGE rank 0 2 WITHSCORES
1) "biki"
2) 100.0
3) "cat"
4) 98.0
5) "zhibin"
6) 87.0
#此时aaa玩家结束游戏得分为90
>zadd rank 90 aaa
#插入到有序队列,在进行查询
> zadd rank 90 aaa
(integer) 1
> ZREVRANGE rank 0 2 WITHSCORES
1) "biki"
2) 100.0
3) "cat"
4) 98.0
5) "aaa"
6) 90.0
排名已经更新了
使用有序集合,你可以非常快地(O(log(N)))完成添加,删除和更新元素的操作。
因为元素是在插入时就排好序的,所以很快地通过评分(score)或者 位次(position)获得一个范围的元素。 访问有序集合的中间元素同样也是非常快的,因此你可以使用有序集合作为一个没用重复成员的智能列表。
在这个列表中, 你可以轻易地访问任何你需要的东西: 有序的元素,快速的存在性测试,快速访问集合中间元素!
简而言之,使用有序集合你可以很好地完成 很多在其他数据库中难以实现的任务。
at first,我们先添加一下数据:
> zadd member_list 10 a 3 b 1 c 4 d 7 e (integer) 5 #返回5,即成功加了5个进入集合。现在试试添加重复的元素 > zadd member_list 9 a 8 f (integer) 1 #这个步骤,返回了1,而不是2,是因为a这个元素已经存在于集合当中了,不会添加成功。 > zrange member_list 0 6 WITHSCORES 1) "c" 2) 1.0 3) "b" 4) 3.0 5) "d" 6) 4.0 7) "e" 8) 7.0 9) "f" 10) 8.0 11) "a" 12) 9.0
可以看到,有序集合排序的规则是根据分母的大小,分母越小排在集合的前面
如下表显示与排序集的一些基本命令:
http://www.yiibai.com/redis/redis_sorted_sets.html)
我们可以实现的事情:
1.排行榜
排行榜是非常常见的实现,比如收入排行榜,积分排行榜。在某种情况下,可以直接缓存整个排行榜,然后设置定时任务,在某个时间点更新。但对于一些实时性比较强的,需要及时更新数据,可以利用redis的有序队列实现,原理是利用有序队列的关联评分。
PS:如果要自己实现,可以考虑使用二叉堆实现,效率能到到O(log(N))
#假定有一个实时的竞技场评分,在玩家结束操作后打分,并动态显示玩家的排行榜
> zadd rank 100 biki 87 zhibin 72 ming 64 fen 98 cat
(integer) 5
#显示得分最高的前三名玩家
> ZREVRANGE rank 0 2 WITHSCORES
1) "biki"
2) 100.0
3) "cat"
4) 98.0
5) "zhibin"
6) 87.0
#此时aaa玩家结束游戏得分为90
>zadd rank 90 aaa
#插入到有序队列,在进行查询
> zadd rank 90 aaa
(integer) 1
> ZREVRANGE rank 0 2 WITHSCORES
1) "biki"
2) 100.0
3) "cat"
4) 98.0
5) "aaa"
6) 90.0
排名已经更新了
相关文章推荐
- ubuntu hiredis环境搭建
- redis async client 与自有框架集成
- win7 64位安装redis 及Redis Desktop Manager使用
- 用Redis存储Tomcat集群的Session
- Linux 下编译 redis 报错解决办法
- 【Linux】ubuntu下安装MySQL、Redis
- Redis 集群规范
- redis订阅关闭异常解决
- redis初级入门,整合spring应用
- redis3.0.5集群部署安装详细步骤
- Redis 的性能幻想与残酷现实
- redis安装
- Redis 源码分析(zmalloc部分)
- 关于Redis的知识汇总[转]
- Redis常用命令
- phpredis pipeline
- Redis+MongDB 常用命令
- 深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
- Redis学习笔记
- Redis集群部署