现在要做一款游戏产品,涉及到计分排行问题, 简单的排行用redis的sort set就能完成的, 可是动态的排行该如何设计呢? 比如按月排行,其实就是当前时间到过去30天内的排行, 因为时间是时刻在变的,所以时间维度是每秒都是变得。 应蓝浩的询问,补充下 是一个游戏,一般10-40秒玩一局, 玩完了,会有评分的, 现在需要月排名(此刻到30*24*3600秒以前的排名), 如果一个人玩多次的,按最好的成绩统计。
ringa_lee
我也来帮忙吧。
也是用的ZSET,比如用户胜利加分:
ZSET
ZINCRBY DAY:20150113 60 Kavlez ZINCRBY DAY:20150113 80 舞千寻
就像这样,那就是一天一个ZSET。 但如果最多也就统计30天的话,那就永远是30个,每天加一个DEL一个。
DEL
每天(或者几分钟)更新一次最近30日ZSET:
ZUNIONSTORE LAST30 2 LAST30 DAY:20150113
前10:
ZREVRANGE LAST30 0 10 WITHSCORES
既然是实时榜,那你就实时更新ZSET的SCORE就可以了。
SCORE
至于你说最近30天的排行榜,我想你说的是最近30天积分增长的排行榜吧,如果总积分榜就没有最近30天的说法了。
产品逻辑参考segmentfault的“榜单”,实现方法就是用ZSET记录每天的用户积分增长,这样周榜、月榜、季榜、年榜都可以用ZUNIONSTORE得出。
segmentfault
ZUNIONSTORE
做过几个游戏的排行榜,说下自己的思路。
排行榜按照时间划分为:
玩家查看排行榜一般来说有两个关注点:
基于上面两点一般会把排行榜数据分成两份:
不知道我讲清楚没。
可以试试socket.io,这个就是维持一个长连接,有了长连接一切就好办啦〜
socket.io
mongodb适合干这个
每次评分都算一条记录(文档),加上时间戳,存起来 出评分榜时aggregate搞定
可以尝试一下 Meteor 框架,是一个基于 nodejs 和 mongodb 的 WebApp 框架,通过 DDP 协议来处理实时通信。实时代码更新,在服务器代码更新后,客户端无须用户干预。而且有延迟同步机制,用户提交的数据实时反馈在屏幕上,如果因为网络原因数据提交失败,数据会在网络重新连接后上传。Meteor官网
Meteor
nodejs
mongodb
WebApp
DDP
採樣密度呢?要先說清楚你的排行依據
我也来帮忙吧。
也是用的
ZSET
,比如用户胜利加分:就像这样,那就是一天一个ZSET。
但如果最多也就统计30天的话,那就永远是30个,每天加一个
DEL
一个。每天(或者几分钟)更新一次最近30日ZSET:
前10:
既然是实时榜,那你就实时更新
ZSET
的SCORE
就可以了。至于你说最近30天的排行榜,我想你说的是最近30天积分增长的排行榜吧,如果总积分榜就没有最近30天的说法了。
产品逻辑参考
segmentfault
的“榜单”,实现方法就是用ZSET
记录每天的用户积分增长,这样周榜、月榜、季榜、年榜都可以用ZUNIONSTORE
得出。做过几个游戏的排行榜,说下自己的思路。
排行榜按照时间划分为:
玩家查看排行榜一般来说有两个关注点:
基于上面两点一般会把排行榜数据分成两份:
不知道我讲清楚没。
可以试试
socket.io
,这个就是维持一个长连接,有了长连接一切就好办啦〜mongodb适合干这个
每次评分都算一条记录(文档),加上时间戳,存起来
出评分榜时aggregate搞定
可以尝试一下
Meteor
框架,是一个基于nodejs
和mongodb
的WebApp
框架,通过DDP
协议来处理实时通信。实时代码更新,在服务器代码更新后,客户端无须用户干预。而且有延迟同步机制,用户提交的数据实时反馈在屏幕上,如果因为网络原因数据提交失败,数据会在网络重新连接后上传。Meteor官网
採樣密度呢?要先說清楚你的排行依據