zoukankan      html  css  js  c++  java
  • 使用python landport库快速实现排行榜

    背景介绍

    排行榜业务使用的频率实在太高了,各种活动都会使用排行榜。经过多次开发后我觉得实现一个简单的排行榜库,它能够完成当前我遇到的所有业务逻辑问题,也希望能够帮助到想要快速开发排行榜业务的同行。

    我设计了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)
    
    

    目前我们只是得到了一个按照给定的项逆序排好了,我们并没有给出这是第几名。当然我们知道下标是0的是第一名,客户端的人就不一定这样认为了。我们可以继续改进如下:

    rk.sort_by("score").add_rank(care='score')
    


    这时候看起来工作才不多收尾了,让产品过来看看。

    产品说他们想给用户更加强烈的竞争感,所以希望排行榜有上升的箭头或者落后的箭头。

    我当时思考了半天,现在你不需要思考了。直接使用下面的方式即可。

    rk.sort_by("score").add_rank(care='score').add_trend()
    

    下面给出两次调用的运行截图。

    我想解释一下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)
    

    总结

    目前为止我们实现了一个简单的排行榜示例,还有很多功能我没有演示。例如:同名的情况证明出来,查看我自己的排名怎么处理。等等有些功能库已经实现,有些则我会慢慢增加库的开发,也期待你的参与。最后给出所有代码

    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)
    
    
  • 相关阅读:
    RII K25A 语音空中飞鼠 红外学习步骤
    淘宝导航栏颜色修改
    上海巨人网络参与网络诈骗整个流程
    xp的停止更新对我们有什么影响?
    USB3.0 和usb 2.0的区别
    一些有意思的脑际急转弯
    淘宝上 1200左右的组装电脑,真的性价比很高么?
    【图文教程】用“iz3d”软件将您的游戏打造为红蓝3D游戏。
    网上下载的“上下3D”和“左右3D”影片该如何播放?
    电脑cmos是什么?和bois的区别?
  • 原文地址:https://www.cnblogs.com/landpack/p/6568962.html
Copyright © 2011-2022 走看看