基于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
选项控制从调用如leaders
或around_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_range
或remove_members_outside_rank
方法会在成员数据哈希中留下数据。这是因为内部Redis方法zremrangebyscore
只返回删除的项目数量。它不返回它删除的成员。
排行榜请求选项
您可以向调用leaders
、all_leaders
、around_me
、members_from_score_range
、members_from_rank_range
和ranked_in_list
传递各种选项。有效选项有
with_member_data
-true
或false
以返回可选成员数据。page_size
- 一个整数值,用于更改该调用的页面大小。members_only
-true
或false
以仅返回成员,而不返回其分数和排名。sort_by
-sort_by
的有效值是score
和rank
。
条件性地在排行榜中排名成员
您可以向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文档,“使用的字典顺序是二进制顺序,它将字符串作为字节数组进行比较。”
并列排名:TieRankingLeaderboard
是Leaderboard
的子类,允许您定义一个排行榜,其中具有相同分数的成员具有相同的排名。例如,具有相关分数的排行榜中的成员将具有以下排名
| 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进行容量规划时请记住这一点。
竞争排名:CompetitionRankingLeaderboard
是Leaderboard
的子类,允许您定义一个排行榜,其中具有相同分数的成员将具有相同的排名,然后在排名数字中留下一个空缺。例如,具有相关分数的排行榜中的成员将具有以下排名
| 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中制作。
官方支持
- CoffeeScript: https://github.com/agoragames/leaderboard-coffeescript
- Python: https://github.com/agoragames/leaderboard-python
- Ruby: https://github.com/agoragames/leaderboard
非官方支持(它们需要一些功能一致性爱)
- Java: https://github.com/agoragames/java-leaderboard
- PHP: https://github.com/agoragames/php-leaderboard
- Scala: https://github.com/agoragames/scala-leaderboard
为排行榜贡献力量
- 查看最新主分支,以确保该功能尚未实现或错误尚未修复
- 查看问题跟踪器,以确保尚未有人请求并/或贡献它
- 分支项目
- 开始功能/错误修复分支
- 提交并推送,直到你对你的贡献满意为止
- 请确保为其添加测试。这很重要,这样我就不会无意中在未来的版本中破坏它。
- 请尽量不要再版本或历史记录上动手脚。如果你想拥有自己的版本,或者有必要,那也很好,但请将其隔离到其自己的提交中,这样我就可以在其周围进行 cherry-pick。
版权
版权(c)2011-2018 Ola Mork,David Czarnecki。有关详细信息,请参阅 LICENSE.txt。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
构建分发
ninchanese-leaderboard-3.7.4.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 744bd87b514da90d0a695c31bd31eed41cb3e81fd1cd39511a3a7fdacd409793 |
|
MD5 | f9dd04f1402b249775250b0e2b2647f8 |
|
BLAKE2b-256 | f48fdbed082a6d53e749ec96cf089b9e725066e3e5e93dc57a7f69bad12a9a9f |
ninchanese_leaderboard-3.7.4-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 713afdca24cc54b2456e78e6fc8573e224f9cf8f6c96944b91b54c0007e24a20 |
|
MD5 | 6e5d1a2894967f141501dc7590ddc12a |
|
BLAKE2b-256 | 99710daa5e6b43af1c953484c5fa6328c1fa534b32fb27af8356a0f0218c88c6 |