用例

排行榜

什么是排行榜

排行榜的概念是显示领先竞争对手的排名名称和当前分数或其他数据点的排行榜,对于计算机游戏世界而言至关重要,但排行榜现在不仅仅涉及游戏,它们还涉及游戏化,是一种更广泛的实现,可以包括一群有共同目标的人同事学生销售小组健身小组志愿者等

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

游戏化排行榜

通过排行榜对任务和目标进行游戏化是一种激励人们的好方法,可以为他们提供与其他小组成员相比他们所处位置的持续反馈。做得好,这可以导致健康的竞争,从而建立小组凝聚力

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

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

排行榜有两种类型

绝对排行榜通过某种全球性指标对所有竞争对手进行排名通常,这些排名会显示该组中排名最高的成员,例如顶级

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

当今排行榜中的挑战

在我们的互联网连接世界中,成千上万的竞争者可以共享流行游戏的排行榜,这同样适用于排行榜的非传统用途,例如健身和健康应用程序以及社交媒体,或者内部组织任务,例如客户服务后勤或减轻欺诈行为

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

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

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

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

为什么将Redis Enterprise用作排行榜

Redis中的排序集ZSET是一种内置的数据结构,使排行榜易于创建和操作

Redis Enterprise基于没有共享的对称架构使数据集大小线性无缝地增长而无需更改应用程序代码

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

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

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

深度排序集

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

将玩家添加到排序组就像使用ZADD命令并传递设置名称,得分和玩家名称一样简单

ZADD球员弗雷德

如果该集合尚不存在,Redis将创建该集合;如果确实存在,则Redis将新数据添加到现有集合中。Sorted Set中的每个项目都必须是唯一的,因此,如果玩家名称成员不存在,则将其添加到集合中但是,如果成员已经存在,则其值将设置为提供的新值。排序集命令让您轻松执行快速的本机排序和报告操作

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

Redis使用ZINCRBY命令轻松传递任何会员的分数,并传递成员名称和分数的增加量

此外,您可以为您的游戏应用程序管理多个排序集,例如,一个全局排序集包括所有锦标赛的总得分,然后每个锦标赛包含多个排序集。然后,您可以使用Redis独特的功能,例如在排序集之间进行操作ZUNIONSTORE用于带或不带砝码的联合操作

这些简单的数据示例不显示图形类型的数据,但这是Redis Sorted的强大功能的一部分。在内存中将其设置为纯数据,而不绑定到任何视图。这意味着您可以使用数据以任意方式显示它

如何建立排行榜

让我们快速地快速了解一下如何在Node js中与以前存在的Web应用程序一起实现排行榜。使用Node Package Manager NPM,可以使用简单的命令将Redis添加到Web应用程序中npm安装redis

将Redis Node软件包安装到Web应用程序项目中后,您可以通过JavaScript API访问Redis功能。节点redis Github存储库可以帮助您入门

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

分数可以是您要用来排名玩家在公司健康计划中被电脑游戏中击落的外星人日常步数的任何数字数据,依此类推。

基本播放器数据如下所示

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

使用哈希存储多个值

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

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

创建Redis哈希很容易这个名为allPlayers的哈希使用以下格式

hset唯一ID,以标识哈希属性名称属性值

接下来,创建一个新的以玩家键命名的哈希,并添加一个具有Fred值的screenName属性。您可以制作哈希键,但是使用stringID的格式IntegerID使其更具可读性当您添加另一个玩家时,您将创建一个像玩家一样的新哈希键

hset播放器屏幕名称Fred

如果要检索为特定哈希存储的所有属性和值名称/值对,只需使用此命令

hgetall播放器

您可以看到此时有一对名称/值对

屏幕名称
弗雷德

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

假设您要保存播放器上次登录的日期

hset播放器lastLoggedIn

现在,当您再次致电hgetall时,您会看到

屏幕名称
弗雷德
lastLoggedIn

只需将每个用户添加到具有自己唯一ID的allPlayers Hash中即可,然后可以将这些用户与包含每个玩家得分的Sorted Set关联

这是一个快速图表,显示了如何将数据绑定在一起

一旦添加了哈希播放器NNN,便有了列表,可以在向排序集添加数据时使用它们来利用这些播放器数据键。这就是您如何利用内存数据库中Redis的功能来处理数以百万计的庞大数据集跟踪每个玩家排名但保持惊人速度的玩家数量

现在,您可以轻松实现一个使用Node和node redis包提取数据的解决方案,以便您可以在Web应用程序上保持排行榜的最新状态。使用node redis包API可以轻松进行此工作,该API允许您将Sorted Set的依据拉回名字玩家排名

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