跳转到主要内容

基于Redis的Python排行榜

项目描述

排行榜

基于Redis的Python排行榜。

基于http://www.agoragames.com/blog/2011/01/01/creating-high-score-tables-leaderboards-using-redis/中提出的思想。

安装

pip install leaderboard

确保您的Redis服务器正在运行!Redis配置超出了本README的范围,但请参阅Redis文档

用法

创建排行榜

请确保需要排行榜库

from leaderboard.leaderboard import Leaderboard

创建一个新的排行榜或附加到名为'highscores'的现有排行榜

highscore_lb = Leaderboard('highscores')

定义排行榜选项

默认选项如下

    DEFAULT_PAGE_SIZE = 25
    DEFAULT_REDIS_HOST = 'localhost'
    DEFAULT_REDIS_PORT = 6379
    DEFAULT_REDIS_DB = 0
    DEFAULT_MEMBER_DATA_NAMESPACE = 'member_data'
    DEFAULT_GLOBAL_MEMBER_DATA = False
    ASC = 'asc'
    DESC = 'desc'
    MEMBER_KEY = 'member'
    MEMBER_DATA_KEY = 'member_data'
    SCORE_KEY = 'score'
    RANK_KEY = 'rank'

如果您想按从低到高的分数排序排行榜,请使用选项order=Leaderboard.ASC。您也可以在创建排行榜的新实例后设置排行榜的order选项。上述各种..._KEY选项控制从调用如leadersaround_me等返回的排行榜数据哈希中的数据。最后,global_member_data选项允许您控制可选成员数据是按排行榜(False)还是全局(True)。

在排行榜中排名成员

使用rank_member将成员添加到您的排行榜中

for index in range(1, 11):
  highscore_lb.rank_member('member_%s' % index, index)

您可以使用相同的成员调用rank_member,排行榜将自动更新。

获取有关您的排行榜的一些信息

highscore_lb.total_members()
10

highscore_lb.total_pages()
1

获取排行榜上特定成员的信息

highscore_lb.score_for('member_4')
4.0

highscore_lb.rank_for('member_4')
7

highscore_lb.rank_for('member_10')
1

从排行榜中检索成员

获取排行榜的第1页

highscore_lb.leaders(1)

[{'member': 'member_10', 'score': 10.0, 'rank': 1}, {'member': 'member_9', 'score': 9.0, 'rank': 2}, {'member': 'member_8', 'score': 8.0, 'rank': 3}, {'member': 'member_7', 'score': 7.0, 'rank': 4}, {'member': 'member_6', 'score': 6.0, 'rank': 5}, {'member': 'member_5', 'score': 5.0, 'rank': 6}, {'member': 'member_4', 'score': 4.0, 'rank': 7}, {'member': 'member_3', 'score': 3.0, 'rank': 8}, {'member': 'member_2', 'score': 2.0, 'rank': 9}, {'member': 'member_1', 'score': 1.0, 'rank': 10}]

将更多成员添加到您的排行榜

for index in range(50, 96):
  highscore_lb.rank_member('member_%s' % index, index)

highscore_lb.total_pages()
3

为给定成员获取“附近”排行榜页面,该页面拉取给定成员上方和下方的成员

highscore_lb.around_me('member_53')

[{'member': 'member_65', 'score': 65.0, 'rank': 31}, {'member': 'member_64', 'score': 64.0, 'rank': 32}, {'member': 'member_63', 'score': 63.0, 'rank': 33}, {'member': 'member_62', 'score': 62.0, 'rank': 34}, {'member': 'member_61', 'score': 61.0, 'rank': 35}, {'member': 'member_60', 'score': 60.0, 'rank': 36}, {'member': 'member_59', 'score': 59.0, 'rank': 37}, {'member': 'member_58', 'score': 58.0, 'rank': 38}, {'member': 'member_57', 'score': 57.0, 'rank': 39}, {'member': 'member_56', 'score': 56.0, 'rank': 40}, {'member': 'member_55', 'score': 55.0, 'rank': 41}, {'member': 'member_54', 'score': 54.0, 'rank': 42}, {'member': 'member_53', 'score': 53.0, 'rank': 43}, {'member': 'member_52', 'score': 52.0, 'rank': 44}, {'member': 'member_51', 'score': 51.0, 'rank': 45}, {'member': 'member_50', 'score': 50.0, 'rank': 46}, {'member': 'member_10', 'score': 10.0, 'rank': 47}, {'member': 'member_9', 'score': 9.0, 'rank': 48}, {'member': 'member_8', 'score': 8.0, 'rank': 49}, {'member': 'member_7', 'score': 7.0, 'rank': 50}, {'member': 'member_6', 'score': 6.0, 'rank': 51}, {'member': 'member_5', 'score': 5.0, 'rank': 52}, {'member': 'member_4', 'score': 4.0, 'rank': 53}, {'member': 'member_3', 'score': 3.0, 'rank': 54}, {'member': 'member_2', 'score': 2.0, 'rank': 55}]

从排行榜获取任意成员列表(例如朋友)的排名和分数

highscore_lb.ranked_in_list(['member_1', 'member_62', 'member_67'])

[{'member': 'member_1', 'score': 1.0, 'rank': 56}, {'member': 'member_62', 'score': 62.0, 'rank': 34}, {'member': 'member_67', 'score': 67.0, 'rank': 29}]

在给定分数范围内从排行榜中检索成员

highscore_lb.members_from_score_range(4, 19)

[{'member': 'member_10', 'score': 10.0, 'rank': 47}, {'member': 'member_9', 'score': 9.0, 'rank': 48}, {'member': 'member_8', 'score': 8.0, 'rank': 49}, {'member': 'member_7', 'score': 7.0, 'rank': 50}, {'member': 'member_6', 'score': 6.0, 'rank': 51}, {'member': 'member_5', 'score': 5.0, 'rank': 52}, {'member': 'member_4', 'score': 4.0, 'rank': 53}]

从给定位置检索排行榜上的单个成员

highscore_lb.member_at(4)

{'member': 'member_92', 'score': 92.0, 'rank': 4}

在给定排名范围内从排行榜中检索成员范围

highscore_lb.members_from_rank_range(1, 5)

[{'member': 'member_95', 'score': 95.0, 'rank': 1}, {'member': 'member_94', 'score': 94.0, 'rank': 2}, {'member': 'member_93', 'score': 93.0, 'rank': 3}, {'member': 'member_92', 'score': 92.0, 'rank': 4}, {'member': 'member_91', 'score': 91.0, 'rank': 5}]

可选成员数据说明

如果您使用可选成员数据,使用remove_members_in_score_rangeremove_members_outside_rank方法会在成员数据哈希中留下数据。这是因为内部Redis方法zremrangebyscore只返回删除的项目数量。它不返回它删除的成员。

排行榜请求选项

您可以向调用leadersall_leadersaround_memembers_from_score_rangemembers_from_rank_rangeranked_in_list传递各种选项。有效选项有

  • with_member_data - truefalse以返回可选成员数据。
  • page_size - 一个整数值,用于更改该调用的页面大小。
  • members_only - truefalse以仅返回成员,而不返回其分数和排名。
  • sort_by - sort_by的有效值是scorerank

条件性地在排行榜中排名成员

您可以向rank_member_if方法传递一个函数,以有条件地在排行榜中排名成员。该函数传递以下5个参数

  • member:成员名称。
  • current_score:成员在排行榜中的当前分数。如果成员当前不在排行榜中,则可能为nil
  • score:成员分数。
  • member_data:可选成员数据。
  • leaderboard_options:排行榜选项,例如'reverse':反向选项的值
def highscore_check(self, member, current_score, score, member_data, leaderboard_options):
  if (current_score is None):
    return True
  if (score > current_score):
    return True
  return False

highscore_lb.rank_member_if(highscore_check, 'david', 1337)
highscore_lb.score_for('david')

1337.0

highscore_lb.rank_member_if(highscore_check, 'david', 1336)
highscore_lb.score_for('david')

1337.0

highscore_lb.rank_member_if(highscore_check, 'david', 1338)
highscore_lb.score_for('david')

1338.0

在多个排行榜中排名成员

highscore_lb.rank_member_across(['highscores', 'more_highscores'], 'david', 50000, str({'member_name': 'david'}))

替代排行榜类型

排行榜库提供3种排名样式。这仅适用于排行榜中具有相同分数的成员。

默认:Leaderboard类使用默认的Redis有序集合排序,具有相同分数的不同成员按字典顺序排序。根据Redis有序集合的Redis文档,“使用的字典顺序是二进制顺序,它将字符串作为字节数组进行比较。”

并列排名:TieRankingLeaderboardLeaderboard的子类,允许您定义一个排行榜,其中具有相同分数的成员具有相同的排名。例如,具有相关分数的排行榜中的成员将具有以下排名

| member     | score | rank |
-----------------------------
| member_1   | 50    | 1    |
| member_2   | 50    | 1    |
| member_3   | 30    | 2    |
| member_4   | 30    | 2    |
| member_5   | 10    | 3    |

TieRankingLeaderboard接受一个额外的选项,即初始化该类的新实例时使用的ties_namespace(默认:ties)。请注意,在其当前实现中,TieRankingLeaderboard类使用一个额外的有序集合来排名分数,因此在为Redis进行容量规划时请记住这一点。

竞争排名:CompetitionRankingLeaderboardLeaderboard的子类,允许您定义一个排行榜,其中具有相同分数的成员将具有相同的排名,然后在排名数字中留下一个空缺。例如,具有相关分数的排行榜中的成员将具有以下排名

| member     | score | rank |
-----------------------------
| member_1   | 50    | 1    |
| member_2   | 50    | 1    |
| member_3   | 30    | 3    |
| member_4   | 30    | 3    |
| member_5   | 10    | 5    |

性能指标

您可以在原始Ruby库的页面查看排行榜库的性能指标

端口

以下端口已经从排行榜gem中制作。

官方支持

非官方支持(它们需要一些功能一致性爱)

为排行榜贡献力量

  • 查看最新主分支,以确保该功能尚未实现或错误尚未修复
  • 查看问题跟踪器,以确保尚未有人请求并/或贡献它
  • 分支项目
  • 开始功能/错误修复分支
  • 提交并推送,直到你对你的贡献满意为止
  • 请确保为其添加测试。这很重要,这样我就不会无意中在未来的版本中破坏它。
  • 请尽量不要再版本或历史记录上动手脚。如果你想拥有自己的版本,或者有必要,那也很好,但请将其隔离到其自己的提交中,这样我就可以在其周围进行 cherry-pick。

版权

版权(c)2011-2018 Ola Mork,David Czarnecki。有关详细信息,请参阅 LICENSE.txt。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

ninchanese-leaderboard-3.7.4.tar.gz (19.8 kB 查看哈希)

上传时间 源代码

构建分发

ninchanese_leaderboard-3.7.4-py3-none-any.whl (16.1 kB 查看哈希)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面