虹科游戏行业数据库解决方案

实时排行榜和排名解决方案

保持排行榜的新鲜度

Redis Enterprise 通过对用例构建的数据结构并提供各种部署选项。

什么是排行榜?

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

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

游戏化排行榜

通过排行榜将任务和目标游戏化是一种激励人们的好方法,它可以为人们提供与其他小组成员相比的排名的持续反馈。如果做得好,这可以带来健康的竞争,从而增强团队凝聚力。

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

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

实时排行榜和排名解决方案

排行榜有两种类型:

  • 绝对排行榜:通过某种全球衡量标准对所有竞争对手进行排名。通常,这些显示组中排名最高的成员,例如前 10 名。
  • 相对排行榜:根据数据的不同方面对参与者进行排名,从而根据更狭窄或相对的标准对成员进行分组。这可能需要复杂的计算来以多种方式滑动数据。例如,常见的游戏场景是显示给定竞争对手以及其上方和下方竞争对手的排名的视图。

当今排行榜面临的挑战

在我们这个互联网连接的世界中,流行游戏的排行榜可以被数十万甚至数百万的竞争对手共享。这同样适用于排行榜的非传统用途,例如健身和健康应用程序和社交媒体,或内部组织任务,例如客户服务、物流或减少欺诈。

用于排行榜的数据不断更新,用户希望看到数据以多种方式切片。这使得排行榜成为实时分析的一个很好的例子,同时也展示了数据层处理读取、写入、排序和其他关键操作的速度。

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

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

实时提供这些数据并保持系统可用超出了许多网络技术的范围。然而,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 中以及以前存在的 Web 应用程序中实现排行榜。借助 Node Package Manager (NPM),可以使用简单的命令轻松将 Redis 添加到您的 Web 应用程序 npm 安装 redis。

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

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

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

基本玩家数据将如下所示:

现在看一些可用于显示数据的 Node.js 代码。

使用哈希存储多个值

您可以创建一个可以由多个变量分割的数据集。为此,将数据存储在代表每个竞争对手的结构中会很有帮助。Redis 提供了这样一种结构,称为哈希。哈希可以保存与一个键关联的多个名称-值对。

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

创建 Redis 哈希很容易。该哈希名为 allPlayers,使用以下格式:

  hset [ unique id (to identify the hash)] [property name] [property value] …

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

   hset player:100 screenName Fred

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

  hgetall player:100

可以看到此时有一对名称-值对。

  1) “screenName”
  2) “Fred”

哈希是一种灵活的结构,很容易动态添加属性和值。

想象一下,您想要保存玩家上次登录的日期:

  hset player:100 lastLoggedIn 2019-07-30

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

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

只需将每个用户使用其自己的唯一 ID 添加到您的 allPlayers 哈希中即可。然后,您可以将它们与包含每个玩家得分的排序集相关联。

下面是一个快速图表,展示了如何将数据联系在一起:

allPlayers 哈希中

添加哈希值(玩家:NNN)后,您就拥有了列表,并且可以在将数据添加到排序集中时使用这些玩家数据键来利用它们。这就是您如何利用 Redis 内存数据库的强大功能来处理巨大的数据集(数百万玩家!),跟踪每个玩家的排名,但保持惊人的速度。

现在,您可以轻松实现使用 Node 和 node_redis 包提取数据的解决方案,以便您可以在 Web 应用程序上保持排行榜的最新状态。使用node_redis包API可以轻松完成这项工作,它允许您按名称(playerRank)拉回排序集。

Redis Enterprise 对于保持排行榜的新鲜度以及让用户回来查看他们的排名至关重要。

立即行动↓