dot 快速的未来将在你所在的城市举办活动。

加入我们在 Redis 发布会

什么是排行榜?

排行榜的概念——显示领先竞争者的排名名称和当前分数(或其他数据点)的计分板——对于电脑游戏世界至关重要,但排行榜现在不仅仅是关于游戏。它们是关于游戏化,一种更广泛的实施,可以包括任何具有共同目标的人群(同事、学生、销售团队、健身团队、志愿者等等)。

排行榜可以通过公开显示每个小组成员的当前排名来鼓励小组中的良性竞争。它们还提供了一种清晰的方式来查看整个团队的持续成就,因为成员朝着目标迈进。

用于游戏化的排行榜

通过排行榜对任务和目标进行游戏化是一种激励人们的好方法,因为它可以为他们提供与其他小组成员相比的排名情况的持续反馈。如果做得好的话,这会导致良性竞争,从而建立小组凝聚力。

以下是一个简单的排行榜的图形示例,一家公司可能会用它来激励员工参与其雇主健康计划。

在这个例子中,员工可以看到排名前列的竞争者及其当前分数。他们还可以看到比赛剩余的时间和激励奖品。当然,随着数据变化(当用户上传经过验证的步数时),排名会实时变化。

排行榜有两种类型

绝对排行榜根据某些全局度量对所有竞争者进行排名。通常,这些排行榜会显示该小组中排名最高的成员,例如前 10 名。

相对排行榜根据数据的不同方面对参与者进行排名,以使成员根据更狭窄或相对的标准进行分组。这可能需要复杂的计算来以多种方式滑动数据。例如,一个常见的游戏场景是一个视图,它显示了给定竞争者的排名以及他们之上和之下的竞争者。

观看我们关于排行榜最佳实践的技术讲座

当今排行榜中的挑战

在我们互联互通的互联网世界中,热门游戏的排行榜可以被数十万甚至数百万的竞争者分享。同样适用于排行榜的非传统用途,例如健身和健康应用程序以及社交媒体,或者内部组织任务,例如客户服务、物流或欺诈缓解。

用于排行榜的数据不断更新,用户希望以多种方式查看数据。这使得排行榜成为实时分析的绝佳示例,也是展示您的数据层处理读、写、排序和其他关键操作的速度的展示。

排行榜带来的技术挑战包括

  • 数百万用户的巨大规模
  • 对大量属性进行数学计算(以多种方式分析数据以获得数据的不同视图)
  • 提供具有高可用性的实时排行榜访问
  • 允许用户通过社交媒体分享他们的排行榜统计数据
  • 允许用户在排行榜上他们感兴趣的属性发生变化时接收通知
  • 允许应用程序以完全分布式的方式更新排行榜,覆盖全球以及发生操作的位置,同时还提供来自任何位置的排行榜状态的全局视图

实时提供这些数据并保持系统可用性超出了许多 Web 技术的范围。但是,Redis Enterprise 通过针对这些用例而构建的数据结构以及 Redis Enterprise 提供的各种部署选项,解决了这一挑战。

为什么选择 Redis Enterprise?

Redis 中的排序集 (ZSET) 是一种内置的数据结构,可以轻松创建和操作排行榜。

Redis Enterprise 基于一种无共享、对称架构,允许数据集大小线性增长,并且无需更改应用程序代码。

Redis Enterprise 提供多种高可用性模型,并允许您以地理分布方式部署 Redis,同时在需要时为用户提供本地延迟。

多种持久性选项(每写入或每秒 AOF 以及快照)不会影响性能,确保您不必在故障后重建数据库服务器。

支持超大型数据集,通过使用智能分层访问内存(RAM、持久性内存或闪存),确保您可以扩展数据集以满足用户的需求,而不会显著影响性能。

深入了解排序集

使用 Redis 的ZADD命令轻松创建排序集。例如,想象一下将一组玩家添加到排行榜。每个玩家都包含一个屏幕名称和玩家的分数,该分数会随着时间的推移不断变化。

将玩家添加到排序集就像使用 ZADD 命令并传递集合的名称、分数和玩家的名称一样简单。

ZADD players 200 Fred

如果集合不存在,Redis 将创建它。如果它存在,那么 Redis 会将新数据添加到现有集合中。排序集中每个项目都必须是唯一的,因此如果玩家名称(成员)不存在,那么它将被添加到集合中。但是,如果成员已经存在,那么它的值将设置为提供的新值。内置的排序集命令让您能够轻松执行快速、本地的排序和报告操作。

例如,ZRANGE 命令返回成员范围。ZRANGEBYSCORE 返回得分范围内的成员范围。ZRANK 返回指定成员的排名。

Redis 使得通过使用 ZINCRBY 命令轻松增加任何玩家的分数,传递成员名称以及要增加的分数。

此外,您可以为您的游戏/应用程序管理多个排序集。例如,全局排序集包括所有锦标赛的汇总分数,然后是每个锦标赛的多个排序集。然后,您可以使用 Redis 的排序集之间操作的独特功能,例如ZUNIONSTORE用于带有和不带有权重的联合操作。

这些简单的数据示例没有显示图形类型数据,但这是 Redis 排序集功能的一部分:它是在内存中的纯数据,与任何视图都不绑定。这意味着您可以使用数据以您喜欢的任何方式显示它。

如何创建排行榜

让我们快速了解如何在 Node.js 中 alongside 现有 Web 应用程序实现排行榜。使用 Node 包管理器 (NPM),可以使用简单的命令npm install redis轻松将 Redis 添加到您的 Web 应用程序中。

将 Redis Node 包安装到您的 Web 应用程序项目后,您可以通过 JavaScript API 访问 Redis 功能。(node_redis Github 存储库上的官方文档可以帮助您入门。)

为了演示,让我们使用排序集创建一个简单的内存数据库。我们将创建名为 player:[uniqueId] 的成员,其中 uniqueId 是一个整数值,可以轻松地由您的 JavaScript 或 Python 代码在用户加入比赛时生成。

分数可以是您想要用来对玩家进行排名的任何数值数据(公司健康计划中的每日步数,电脑游戏中击落的敌人等等)。

基本玩家数据如下所示

leaderboard-playerdata

现在看一下您可以用来显示数据的 Node.js 代码片段。

使用哈希存储多个值

您可以创建一个可以通过多个变量切片的数据集。为此,最好将数据存储在代表每个竞争者的结构中。Redis 提供了这样的结构,称为哈希。哈希可以保存与一个键关联的许多名称-值对。

您可以使用简单的数字键作为哈希中的唯一标识符,然后将该唯一键与一个排序集关联,该排序集将包含分数和键。这样,您就可以快速获得顶级竞争者的分数或一系列竞争者的分数。然后,如果您想要更多数据,您可以轻松地使用存储在排序集中的键值从哈希中获取它。

创建 Redis 哈希很简单。这个名为 allPlayers 的哈希使用以下格式

hset [唯一 ID(用于标识哈希)] [属性名称] [属性值] ...

接下来,创建一个新的哈希,其键名为 player:100,并添加一个名为 screenName 的属性,其值为 Fred。您可以只将哈希键设为 100,但使用 [stringID:IntegerID] 的格式可以使它更易读。当您添加另一个玩家时,您将创建一个新的哈希键,例如 player:101。

hset player:100 screenName Fred

如果您想要检索为特定哈希存储的所有属性和值(名称-值对),只需使用以下命令

hgetall player:100

您可以看到此时有一个键值对。

1) "screenName"
2) "Fred"

Hash 是一种灵活的结构,可以轻松地动态添加属性和值。

假设您想保存玩家上次登录的日期。

hset player:100 lastLoggedIn 2019-07-30

现在,当您再次调用 hgetall 时,您将看到

1) "screenName"
2) "Fred"
3) "lastLoggedIn"
4) "2019-07-30"

只需将每个用户添加到您的 allPlayers Hash 中,并为其分配唯一的 ID。然后,您可以将它们与一个有序集合相关联,该有序集合将包含每个玩家的分数。

以下是一个快速图表,展示了如何将您的数据绑定在一起。

leaderboard-datachart

添加完 Hash(player:NNN)后,您将拥有列表,并且可以使用这些玩家数据键在向有序集合添加数据时进行利用。这就是您如何利用 Redis 内存数据库的强大功能来处理大型数据集(数百万玩家!),这些数据集跟踪每个玩家的排名,但速度惊人。

现在,您可以轻松地实施一个使用 Node 和 node_redis 包来拉取数据的解决方案,以便您可以使排行榜在您的 Web 应用程序上保持最新。使用 node_redis 包 API 可以轻松完成此工作,它允许您按名称(playerRank)拉取有序集合。

Redis 企业版对于保持排行榜最新和吸引用户回来查看他们的排名至关重要。

想要了解更多信息?

观看我们最近的关于使用 Redis 进行排行榜最佳实践的科技讲座!

Intro to Leaderboards