dot Redis 8 来了——而且是开源的

了解更多

如何使用 Redis 构建一个允许您构建实时多人游戏的应用程序

在线游戏正迅速成为最受欢迎的娱乐形式之一。技术繁荣,以及我们对互联网使用量的增加,使得游戏更容易上手,让来自世界各地的人们可以相互竞争。 

由于玩家的地理分布范围很广,游戏必须使用低延迟数据库才能让用户实时互动。命令和游戏响应之间的任何延迟都会产生摩擦并妨碍参与。 

高级程序员 Tinco Andringa 接受了这一挑战,并创建了自己的游戏平台 Topscorio。通过使用 Redis,数据可以实时发送、处理和检索,具有出色的连贯性,创建了一个游戏平台,该平台对玩家命令具有超快响应。 

让我们来看看 Tinco 是如何将这个应用程序组合在一起的。但在我们继续深入之前,我们想指出我们在 Redis Launchpad 上有一系列令人兴奋的应用程序供您查看。因此,请务必在阅读完这篇文章后浏览一下!

https://www.youtube.com/embed/NHEjqVq23z4

如何构建一个允许你构建实时多人游戏的应用程序

  1. 你将构建什么?
  2. 你需要什么?
  3. 架构
  4. 开始
  5. 它是如何工作的
  6. 数据如何存储
  7. 数据如何访问
  8. 结论

1. 你将构建什么?

您将构建一个应用程序,该应用程序允许开发人员创建自己的在线多人游戏。 Topscorio 通过跟踪高分来优化游戏体验,而无需担心玩家作弊和管理大型网络基础设施。 

下面我们将向您展示如何从头开始构建此应用程序,突出显示您需要的组件及其功能。 

2. 你需要什么?

  • JavaScript: 用作首选编程语言。
  • TypeScript: 用作构建在 Javascript 之上的类型编程语言。
  • Redis: 用作开源、内存数据结构存储、数据库、缓存和消息代理。 
  • RedisJSON: 允许从 Redis 键存储、更新和获取 JSON 值
  • WebSocket.IO: 用作抽象 WebSocket 连接的库。

3. 架构

  • 前端通过 WebSocket 连接到后端。 
  • 前端向后端发送请求,请求订阅频道并执行命令。 
  • 然后,后端将频道广播到所有连接的客户端,并发送带有更新的消息作为对客户端命令的响应。 
  • 用户会话和信息存储在 Redis 数据库中,并设置了过期时间。
  • 游戏日志是玩家一起使用游戏的实例。这是保存所有游戏动作和状态的地方。此处也建议持久性。

4. 开始

先决条件

步骤 1:克隆存储库

git clone https://github.com/redis-developer/topscorio

步骤 2. 设置 Redis Enterprise Cloud 

创建您的免费 Redis Enterprise Cloud 帐户。 单击“开始”后,您将收到一封包含激活帐户并完成注册过程的链接的电子邮件。

My Image

步骤 3. 创建您的订阅

接下来,您必须创建 Redis Enterprise Cloud 订阅。 在 Redis Enterprise Cloud 菜单中,单击“创建您的订阅”。

按照 https://docs.redis.com/latest/rc/rc-quickstart/ 创建启用了 RedisJSON 模块的 Redis Enterprise Cloud。

步骤 4. 输入数据库详细信息

单击“创建数据库”。 输入数据库名称并选择 RedisJSON 模块。

My Image

步骤 5. 设置环境变量

创建一个空的 .env 文件并添加以下参数

NODE_ENV=development
SERVER_PORT=5020
SESSION_REDIS=redis://default:<pass>@<url>
USERS_REDIS=redis://default:<pass>@<url>
GAMES_REDIS=redis://default:<pass>@<url>
GAME_LOGS_REDIS=redis://default:<pass>@<url>
SENDGRID_API_KEY=<SENDGRID_API_KEY>

根据需要填写数据库地址、密码和 sendgrid API 密钥。

然后在终端中运行

npm install
npm run backend
[email protected] backend /root/topscorio> npm run build && node .

然后,在另一个终端中,运行以下命令

npm run frontend
npm run frontend

> [email protected] frontend /root/topscorio
> webpack serve


> [email protected] build /root/topscorio
> tsc && webpack build

ℹ 「wds」: Project is running at http://localhost:5010/
ℹ 「wds」: webpack output is served from /
ℹ 「wds」: Content not from webpack is served from /root/topscorio/dist/frontend

并导航到浏览器中的 http://localhost:5010

单击“立即开始”并输入电子邮件地址

该应用程序实现了一个示例国际象棋游戏,打开多个浏览器会话进行测试。

Screenshot showing online multiplayer chess

5. 数据如何存储

用户和会话

用户和会话存储在 backend/authentication_store.ts 中进行管理。 这会为每个会话生成唯一的会话令牌。 这是一个例子

SETEX session-123abc 259200 {"some": "json"}.

通过从 localStorage 获取设置,然后从 Redis 检索会话来恢复会话。 这是一个例子

GET session-123abc

新的身份验证令牌以相同的方式存储,但过期时间较短。 

用户使用以下命令存储

JSON.SET

注意:电子邮件地址用作密钥。 

用户使用以下命令检索

JSON.GET

注意:这用作检索整个对象的路径。 

6. 它是如何工作的

  • 前端通过 WebSocket 连接到后端。 
  • 前端向后端发送请求,请求订阅频道并执行命令。 
  • 然后,后端将频道广播到所有连接的客户端,并发送带有更新的消息作为对客户端命令的响应。 
  • 用户会话存储在 SESSION_REDIS 数据库中,并设置了过期时间。
  • 用户信息存储在 USERS_REDIS 中。 建议为此数据库启用持久性。
  • 游戏保存在 GAMES_REDIS 中; 此外,应保留此信息。 游戏日志是玩家一起使用游戏的实例。 这是保存所有游戏动作和状态的地方。 此处也建议持久性。

游戏和游戏日志存储在 backend/games_store.ts 中进行管理。 所有游戏的缓存都存储在 Redis 数据库中,密钥如下: all-games。 当服务器启动时,首先使用以下命令检索它

JSON.GET all-games

如果它为空,则将使用以下命令填充它

JSON.SET all-games . {"newest": []}

当服务器启动时,它将订阅游戏数据库上的最新频道以及游戏日志数据库上的开放频道。 它使用 SUBSCRIBE 命令执行此操作,如下所示: 

SUBSCRIBE newest

每当客户端对频道表现出兴趣时,服务器就会启动订阅。 例如,当用户加入 id 为 abc123 的游戏时,服务器将使用以下命令订阅该游戏

SUBSCRIBE abc123

目前,服务器不会取消订阅。 当用户创建一个游戏时,服务器会在最新频道上发布一条消息,如下所示

PUBLISH newest { "gameInfo": ... } 

此外,服务器执行以下命令将用户的游戏添加到所有游戏最新的数组中

JSON.ARRAPPEND all-games .newest {"gameInfo" : ... }

为了确保它不会溢出,服务器将执行以下命令来缩短其备份

JSON.arrtrim all-games .newest <begin> <end>

 创建后,使用以下命令检索游戏

JSON.GET game-<gameid>

 

7. 应用程序如何工作

登录/注册

登录和注册都共享相同的过程。 首先,您需要单击主页上的“立即开始”按钮。 接下来,您需要提供您的电子邮件地址以接收确认电子邮件。 在您的收件箱中打开此电子邮件,复制注册链接,然后将其粘贴到您的浏览器上。 

然后,您将被带到一个新页面。 单击“立即开始”按钮即可开始。 

创建新游戏

当您登录时,您将立即进入“创建新游戏”页面。 在顶部,在给定的字段中输入您的游戏名称。 然后,您需要将您的游戏逻辑粘贴到下面的大空白框中。 

完成此操作后,按“创建游戏”以继续下一步。 

结论:通过低延迟增强游戏体验

如今的玩家期望游戏在所有方面都具有超快的响应速度,命令之间的延迟几乎不存在。 即使只有一个滞后也足以损害用户体验并让玩家感到沮丧,这只会将他们推向可以流畅运行而不会出现任何问题的游戏。 

借助 Redis,Tinco 能够通过其为用户提供实时响应的能力来最大化游戏体验。 架构中的组件变得更加互连,数据传输变得无缝且一致,使玩家能够在线实时相互竞争,而不管其位置如何。 

要获得有关如何制作此应用程序的完整视觉演示,请观看 Timo 的 YouTube 视频。 如果您喜欢这篇文章,您应该知道这只是 Redis 功能的冰山一角。

在世界各地,程序员们正在使用 Redis 构建创新型应用程序,这些程序正在对日常生活产生深远的影响。请务必查看 Redis Launchpad,以访问一系列令人兴奋的应用程序,从而激发您的灵感。

谁开发了这个应用?

Tinco Andringa

Tinco 是 AeroScan 的首席软件工程师。请务必访问他的 GitHub 页面,以随时了解他参与的所有项目。