背景介绍

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

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

使用python landport库快速实现排行榜的更多相关文章

  1. Python第三方库wordcloud(词云)快速入门与进阶

    前言: 笔主开发环境:Python3+Windows 推荐初学者使用Anaconda来搭建Python环境,这样很方便而且能提高学习速度与效率. 简介: wordcloud是Python中的一个小巧的 ...

  2. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  3. 常用python机器学习库总结

    开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...

  4. [Python] 机器学习库资料汇总

    声明:以下内容转载自平行宇宙. Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: ...

  5. python常用库

    本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...

  6. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

  7. Python图像处理库:Pillow 初级教程

    Python图像处理库:Pillow 初级教程 2014-09-14 翻译 http://pillow.readthedocs.org/en/latest/handbook/tutorial.html ...

  8. Python标准库的学习准备

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准 ...

  9. Python标准库——走马观花

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一套很有用的标准库(standard library).标准库会随着 ...

随机推荐

  1. SuperSocket入门(一)-Telnet服务器和客户端请求处理

    本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例. 开始我的第一个Telnet控制台项目之旅: 创建控制台项目:打开vs程序,文件=> ...

  2. Excel实用知识3

    纯手打,可能有错别字,使用的版本是office2013 转载请注明出处 http://www.cnblogs.com/hnnydxgjj/p/6343914.html ,谢谢 数据透视表 数据透视表是 ...

  3. yum安装CDH5.5 Hadoop集群

    1.环境说明 系统环境: 系统环境:centos6.7 Hadoop版本:CDH5.5 JDK运行版本:1.7.0_67 集群各节点组件分配: 2.准备工作 安装 Hadoop 集群前先做好下面的准备 ...

  4. .net core中加载lua脚本的类库: MoonSharp

    前言 MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单: 官网 ...

  5. LoadRunner 调用Dll完成加密解密

    LoadRunner里的函数比较少,没有MD5.Base64加密. 我们可以通过在C++里把一些加解密写成函数,供LR调用. DLL函数编写 C++里新建工程Class Library(此处是用VS2 ...

  6. 使用net Manager工具远程连接oracle

    一,在服务端配置oracle端口 在命令行中输入netca命令,打开相关配置默认端口号为1521 二,配置端口后使用Telnet工具调试端口是否联通 在命令行输入telnet 服务器ip 端口号 三, ...

  7. 关于post与get请求参数存在特殊字符问题

    遇到项目中存在文本编辑框输入特殊字符 比如:# ? & 空格 , 导致后台接受不到参数问题,对可能存在特殊字符的参数进行encodeURIComponent; C#后台接受参数不需要解码 也可 ...

  8. SignalR中长连接与HUB连接的使用方式以及区别

    1 using Microsoft.AspNet.SignalR; 2 using System; 3 using System.Collections.Generic; 4 using System ...

  9. 探索Javascript设计模式---单例模式

    最近打算系统的学习javascript设计模式,以便自己在开发中遇到问题可以按照设计模式提供的思路进行封装,这样可以提高开发效率并且可以预先规避很多未知的问题. 先从最基本的单例模式开始. 什么是单例 ...

  10. R语言从小木虫网页批量提取考研调剂信息

    一.从URL读取并返回html树     1.1 Rcurl包         使用Rcurl包可以方便的向服务器发出请求,捕获URI,get 和 post 表单.比R socktet连接要提供更高水 ...