Redis

未匹配的标注

AdonisJS 有自己的包用于处理 Redis 数据库,它在内部使用 ioredis,但改进了 pub/sub 层,并为 连接管理健康检查 提供一流的支持。

第一步是使用以下说明安装和配置包。

// title: 安装
npm i @adonisjs/redis
// title: 配置
node ace configure @adonisjs/redis

# CREATE: config/redis.ts
# CREATE: contracts/redis.ts
# UPDATE: .env
# UPDATE: tsconfig.json { types += "@adonisjs/redis" }
# UPDATE: .adonisrc.json { providers += "@adonisjs/redis" }
// title:验证环境变量
/**
 * 确保将以下验证规则添加到
 * `env.ts` 文件来验证环境变量。
 */
export default Env.rules({
  // ...现有规则
  REDIS_CONNECTION: Env.schema.enum(['local'] as const),
  REDIS_HOST: Env.schema.string({ format: 'host' }),
  REDIS_PORT: Env.schema.number(),
  REDIS_PASSWORD: Env.schema.string.optional(),
})
  • 改进的发布/订阅支持
  • 模板自由多连接管理
  • 内置健康检查

 

配置

redis 的配置存储在 config/redis.ts 文件中,您可以在此文件中定义一个或多个命名连接,它们的生命周期将自动为您管理。

import { redisConfig } from '@adonisjs/redis/build/config'

export default redisConfig({
  connection: Env.get('REDIS_CONNECTION'),

  connections: {
    local: {
      host: Env.get('REDIS_HOST'),
      port: Env.get('REDIS_PORT'),
      password: Env.get('REDIS_PASSWORD', ''),
      db: 0,
      keyPrefix: '',
    },
  },
})

connection

用于进行所有 redis 查询的默认连接,从 REDIS_CONNECTION 环境变量推断连接值。

连接

你计划在应用程序中使用的可用连接列表。随意从此对象添加/删除连接。

用法

设置完成后,你可以导入模块并执行 redis 命令。来自 ioredis 的所有方法都由 AdonisJS redis 模块支持。

import Redis from '@ioc:Adonis/Addons/Redis'

await Redis.set('foo', 'bar')
const value = await Redis.get('foo')

你可以使用 Redis.connection 方法在连接之间切换。我们为每个连接创建/管理单例实例,并在应用程序的整个生命周期中使用它。

import Redis from '@ioc:Adonis/Addons/Redis'

await Redis
  .connection('session') // 👈 Switching connection
  .set('foo', 'bar')

发布/订阅

Redis 强制你在使用 pub/sub 时维护两个单独的连接,其中订阅者使用专用连接来监听新消息。

在 AdonisJS 中,我们改进了 pub/sub 的 API 并在内部为你管理订阅者连接,因此你不必手动创建和管理它。

为了演示,让我们创建一个发布/订阅频道来跟踪用户注册。首先通过执行以下 Ace 命令创建一个新的预加载文件。

node ace make:prldfile redis

# ✔  create    start/redis.ts

打开新创建的文件并将以下代码片段粘贴到其中。

// title: start/redis.ts
import Redis from '@ioc:Adonis/Addons/Redis'

Redis.subscribe('user:signup', (user: string) => {
  console.log(JSON.parse(user))
})

接下来,创建一个伪路由以在每个新的HTTP请求上发布到 user:signup 通道。

// start/routes.ts 文件
import Route from '@ioc:Adonis/Core/Route'
import Redis from '@ioc:Adonis/Addons/Redis'

Route.get('/signup', async () => {
  await Redis.publish('user:signup', JSON.stringify({ id: 1 }))

  return 'handled'
})
  • Redis.subscribe 方法监听给定频道上的消息。
  • Redis.publish 方法用于将事件发布到给定通道。
  • 消息作为字符串传递,因为在 Pub/sub 期间,Redis 不支持其他数据类型。

pub/sub 模式

Redis 还支持使用 pub/sub 模式。你必须使用 psubscribe 方法,而不是 subscribe

Redis.psubscribe('user:*', (event: string, user: string) => {
  console.log(event, JSON.stringify(user))
})

运行状况检查

Redis 模块使用 AdonisJS 健康检查 模块报告连接健康状况。你需要做的就是在配置文件中启用它。

// config/redis.ts 文件
{
  local: {
    host: Env.get('REDIS_HOST', '127.0.0.1') as string,
    port: Env.get('REDIS_PORT', '6379') as string,
    password: Env.get('REDIS_PASSWORD', '') as string,
    db: 0,
    keyPrefix: '',
    healthCheck: true, // 👈 运行状况检查
  },
}

现在,你可以使用健康检查模块来查看你的 redis 连接的状态。

import Route from '@ioc:Adonis/Core/Route'
import HealthCheck from '@ioc:Adonis/Core/HealthCheck'

Route.get('health', async ({ response }) => {
  const report = await HealthCheck.getReport()

  return report.healthy
    ? response.ok(report)
    : response.badRequest(report)
})

"不健康的联系报告"

关闭连接

你可以使用以下方法之一关闭 redis 连接。

quit

quit 方法优雅地关闭了 redis 连接。此方法将等待所有排队的命令完成。

await Redis.quit()
await Redis.connection('name').quit()

disconnect

disconnect 方法会立即中断连接且不会等待现有命令完成。

await Redis.disconnect()
await Redis.connection('name').disconnect()

quitAll

类似于 quit,但会退出所有连接。

await Redis.quitAll()

disconnectAll

类似于 disconnect,但断开所有连接。

await Redis.disconnectAll()

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/adonisjs/5.x/di...

译文地址:https://learnku.com/docs/adonisjs/5.x/di...

上一篇 下一篇
贡献者:3
讨论数量: 0
发起讨论 只看当前版本


暂无话题~