在线游戏正在迅速成为最受欢迎的娱乐形式之一。技术繁荣以及我们对互联网的使用量增加,使游戏更容易获得,使来自世界各地的人们能够互相竞争。
由于玩家的地理分布范围,游戏必须使用低延迟数据库,以允许用户实时相互交互。命令和游戏响应之间存在延迟的任何情况都会造成摩擦并阻碍参与。
高级程序员 Tinco Andringa 接受了这一挑战,并创建了自己的游戏平台 Topscorio。通过使用 Redis,数据以极高的一致性实时发送、处理和检索,创建了一个对玩家命令反应极快的游戏平台。
让我们看看 Tinco 是如何将这个应用程序组合在一起的。但在此之前,我们要指出,我们有一系列激动人心的应用程序供您在 Redis Launchpad 上查看。所以请务必在这篇文章之后查看它们!
您将构建一个应用程序,允许开发人员创建自己的在线多人游戏。Topscorio 通过跟踪高分来优化游戏体验,而无需担心玩家作弊和管理大型网络基础设施。
下面我们将向您展示如何从头开始构建此应用程序,重点介绍您将需要的组件及其功能。
git clone https://github.com/redis-developer/topscorio
创建您的免费 Redis Enterprise Cloud 帐户。点击“开始”后,您将收到一封包含激活帐户链接的电子邮件,完成注册流程。
接下来,您需要创建一个 Redis Enterprise Cloud 订阅。在 Redis Enterprise Cloud 菜单中,点击“创建您的订阅”。
按照 https://docs.redis.com/latest/rc/rc-quickstart/ 的说明创建启用了 RedisJSON 模块的 Redis Enterprise Cloud。
点击“创建数据库”。输入数据库名称并选择 RedisJSON 模块。
创建一个空的 .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
topscorio-auth@1.0.0 backend /root/topscorio> npm run build && node .
然后,在另一个终端中,运行以下命令
npm run frontend
npm run frontend
> topscorio-auth@1.0.0 frontend /root/topscorio
> webpack serve
> topscorio-auth@1.0.0 build /root/topscorio
> tsc && webpack build
ℹ 「wds」: Project is running at https://#:5010/
ℹ 「wds」: webpack output is served from /
ℹ 「wds」: Content not from webpack is served from /root/topscorio/dist/frontend
然后,在浏览器中导航到 https://#:5010。
点击“立即开始”并输入电子邮件地址
该应用程序实现了一个示例象棋游戏,打开多个浏览器会话以测试它。
用户和会话
用户和会话存储在 backend/authentication_store.ts 中管理。这为每个会话生成一个唯一的会话令牌。以下是一个示例
SETEX session-123abc 259200 {"some": "json"}.
通过从 localStorage 获取设置,然后从 Redis 检索会话来恢复会话。以下是一个示例
GET session-123abc
新的身份验证令牌以相同的方式存储,但过期时间更短。
使用以下命令存储用户
JSON.SET
注意:电子邮件地址用作键。
使用以下命令检索用户
JSON.GET
注意:这用作检索整个对象的路径。
游戏和游戏日志存储在 backend/games_store.ts 中管理。所有游戏的缓存存储在 Redis 数据库中,键为:all-games。服务器启动时,它将首先使用以下命令检索它
JSON.GET all-games
如果为空,则将使用以下命令填充它
JSON.SET all-games . {"newest": []}
服务器启动时,它将订阅游戏数据库上的最新频道,以及游戏日志数据库上的打开频道。它使用以下 SUBSCRIBE 命令执行此操作:
SUBSCRIBE newest
每当客户端对频道感兴趣时,服务器都会启动订阅。例如,当用户加入 id 为 abc123 的游戏时,服务器将使用以下命令订阅该游戏
SUBSCRIBE abc123
目前,服务器没有执行 UNSUBSCRIBE。当用户创建游戏时,服务器会在最新频道上发布一条消息,如下所示
PUBLISH newest { "gameInfo": ... }
此外,服务器执行以下命令将用户的游戏添加到所有游戏的最新数组中
JSON.ARRAPPEND all-games .newest {"gameInfo" : ... }
为了确保它不会溢出,服务器将执行以下命令缩短其备份
JSON.arrtrim all-games .newest <begin> <end>
创建后,使用以下命令检索游戏
JSON.GET game-<gameid>
登录/注册
登录和注册共享相同的流程。首先,您需要点击主页上的“立即开始”按钮。接下来,您需要提供您的电子邮件地址以获取确认电子邮件。在收件箱中打开此电子邮件,复制注册链接,然后将其粘贴到您的浏览器中。
然后您将被带到一个新页面。点击“立即开始”按钮开始。
创建新游戏
登录后,您将立即进入“创建新游戏”页面。在顶部,在给定的字段中输入您的游戏名称。然后您需要将您的游戏逻辑粘贴到下面的大空白框中。
完成这些操作后,按下“创建游戏”继续下一步。
如今的玩家期望游戏在各个方面都反应灵敏,命令之间的延迟几乎不存在。即使只有一个延迟也足以损害用户体验并让玩家感到沮丧,这只会将他们推向能够流畅运行且没有任何故障的游戏。
借助 Redis,Tinco 能够通过其为用户提供实时响应的能力来最大程度地提升游戏体验。架构中的组件变得更加互连,数据传输变得既无缝又一致,允许玩家实时在线互相竞争,无论他们身在何处。
要全面了解此应用程序是如何制作的,请观看 Timo 在 此处的 YouTube 视频。如果您喜欢这篇文章,您应该知道这只是 Redis 功能的冰山一角。
世界各地的程序员都在使用 Redis 构建创新型应用程序,这些应用程序对日常生活产生了深远的影响。请务必查看 Redis Launchpad,以访问一系列激动人心的应用程序,激发您的灵感。
Tinco 是 AeroScan 的领先软件工程师。 确保访问他的 GitHub 页面 ,以了解他参与的所有项目。