使用python landport库快速实现排行榜
2017-03-17 23:27
246 查看
背景介绍
排行榜业务使用的频率实在太高了,各种活动都会使用排行榜。经过多次开发后我觉得实现一个简单的排行榜库,它能够完成当前我遇到的所有业务逻辑问题,也希望能够帮助到想要快速开发排行榜业务的同行。
我设计了
landport游戏框架,但是目前该框架只是提供
websocket的连接管理提供有些房间之间的通信等。还未投入生产而组件类的开发业余时间进行。例如接下来介绍的排行榜就可以投入使用了,期待更您的参与。github
安装
pip install landport
分析需要
产品说暑假就要到了,准备对我们的游戏做活动。那么如果玩家在这段时间内得分靠前就可以获得礼品,礼品是按照不同的排名分不同的等级。
我们需要解决的第一问题是怎么排序,然后是怎么匹配奖品。假设我们的数据格式如下:
data = [ { "uid" : 10011, "score": 120, }, { "uid": 10022, "score":230 }, { "uid": 10033, "score":222 }, { "uid": 10044, "score":30 } ]
这是我们的初始化数据,一般这些数据是通过数据库获取到的。下面声明一个排行榜实例,排行榜有一个需求是显示用户的榜单是上升还是下降,这个需要数据库缓存上一次的结果,目前使用的缓存是
redis数据库实现。所以这里需要大家安装并且启动你的
redis数据库。
import redis from landport.core.rank import RanklistBase as Ranklist r = redis.Redis("127.0.0.1", 6379, 0) rk = Ranklist('my_redis_cache', r)
下面是把我们的数据一个个
push_in到我们的排行榜中,这里我们使用一个循环去加载数据。
for item in data: rk.push_in(item)
我们的排行榜有了数据后就可以进行相应的操作了,首先是排序。
rk.sort_by("score")
我们排序完成后可以通过下面的方式得到排序后的排行榜。
new_data = rk.top(10)
下面查看当前的全部代码如下:
import redis
from landport.core.rank import RanklistBase as Ranklist
r = redis.Redis("127.0.0.1", 6379, 0)
data = [ { "uid" : 10011, "score": 120, }, { "uid": 10022, "score":230 }, { "uid": 10033, "score":222 }, { "uid": 10044, "score":30 } ]
if __name__ == '__main__':
print(data)
rk = Ranklist('my_redis_cache', r)
for item in data: rk.push_in(item)
rk.sort_by("score")
new_data = rk.top(10)
print(new_data)
![](https://images2015.cnblogs.com/blog/739685/201703/739685-20170317224827713-804695010.png)
目前我们只是得到了一个按照给定的项逆序排好了,我们并没有给出这是第几名。当然我们知道下标是
0的是第一名,客户端的人就不一定这样认为了。我们可以继续改进如下:
rk.sort_by("score").add_rank(care='score')
![](https://images2015.cnblogs.com/blog/739685/201703/739685-20170317230559448-1293221683.png)
这时候看起来工作才不多收尾了,让产品过来看看。
产品说他们想给用户更加强烈的竞争感,所以希望排行榜有上升的箭头或者落后的箭头。
我当时思考了半天,现在你不需要思考了。直接使用下面的方式即可。
rk.sort_by("score").add_rank(care='score').add_trend()
下面给出两次调用的运行截图。
![](https://images2015.cnblogs.com/blog/739685/201703/739685-20170317231018870-1949092374.png)
我想解释一下
trend项,我设计的时候定义了如下规则
-1 ---> 名次下降 0 ---> 名次不变 1 ---> 名次上升
当要与客户端联调的时候发现,自己忘记加奖品了。不过使用
landport你可以调用
add_gift实现奖品的添加,只需要配置好奖品的映射就可以了。下面咱们先设计好奖品的配置。
gift_config = { "1":{ "name":"iPhone 7 plus", "something":"something" }, "2~3":{ "name":"Nokia ...", "something":"gift img url" }, "4":{ "name":"flower", "something":"desc ." } }
然后继续链式调用我们的
add_gift方法。
rk.sort_by("score").add_rank(care='score').add_trend().add_gift(gift_config)
![](https://images2015.cnblogs.com/blog/739685/201703/739685-20170317231952901-845681561.png)
总结
目前为止我们实现了一个简单的排行榜示例,还有很多功能我没有演示。例如:同名的情况证明出来,查看我自己的排名怎么处理。等等有些功能库已经实现,有些则我会慢慢增加库的开发,也期待你的参与。最后给出所有代码import redis
from landport.core.rank import RanklistBase as Ranklist
r = redis.Redis("127.0.0.1", 6379, 0)
data = [ { "uid" : 10011, "score": 120, }, { "uid": 10022, "score":230 }, { "uid": 10033, "score":222 }, { "uid": 10044, "score":30 } ]
gift_config = { "1":{ "name":"iPhone 7 plus", "something":"something" }, "2~3":{ "name":"Nokia ...", "something":"gift img url" }, "4":{ "name":"flower", "something":"desc ." } }
if __name__ == '__main__':
print(data)
rk = Ranklist('my_redis_cache', r)
for item in data: rk.push_in(item)
rk.sort_by("score").add_rank(care='score').add_trend().add_gift(gift_config)
new_data = rk.top(10)
print(new_data)
相关文章推荐
- 使用python实现快速排序
- 使用Python Flask框架快速实现简单API
- 使用python脚本语言实现快速打包
- 使用Python Falcon框架快速实现简单API
- 使用Python快速实现显示器关闭和锁住桌面
- 使用python实现快速搭建简易的FTP服务器
- Python网络编程:使用pexpect实现快速ssh连接
- 使用Python SocketServer快速实现多线程网络服务器
- 使用Python快速实现显示器关闭和锁住桌面
- 使用MFC快速实现网络编程
- 使用MFC快速实现网络编程 CAsyncSocket
- 使用MFC快速实现网络编程 CAsyncSocket
- 使用MFC快速实现网络编程 CAsyncSocket
- 使用MFC快速实现网络编程 CAsyncSocket
- 使用MFC快速实现网络编程 CAsyncSocket
- 快速实现国际化---插件ResourceBunbleEditor的使用
- 使用MFC快速实现网络编程 CAsyncSocket
- 使用Javascript实现邮箱快速登录的方法!!
- 使用INDY的IdMappedPortTCP控件实现动态的HTTP代理服务器