在线游戏正迅速成为最受欢迎的娱乐形式之一。技术繁荣,以及我们对互联网使用量的增加,使得游戏更容易上手,让来自世界各地的人们可以相互竞争。
由于玩家的地理分布范围很广,游戏必须使用低延迟数据库才能让用户实时互动。命令和游戏响应之间的任何延迟都会产生摩擦并妨碍参与。
高级程序员 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
[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。
单击“立即开始”并输入电子邮件地址
该应用程序实现了一个示例国际象棋游戏,打开多个浏览器会话进行测试。
用户和会话
用户和会话存储在 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
目前,服务器不会取消订阅。 当用户创建一个游戏时,服务器会在最新频道上发布一条消息,如下所示
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 页面,以随时了解他参与的所有项目。