Redis
AdonisJs tem suporte de primeira classe para Redis construído em cima de ioredis com uma melhor API pub/sub.
NOTA
Configuração, API de eventos e todos os métodos ioredis são 100% suportados. Veja o repositório ioredis para documentação completa.
Configuração
Como o Provedor Redis não é instalado por padrão, precisamos obtê-lo de npm
:
adonis install @adonisjs/redis
Em seguida, registre o provedor dentro do arquivo start/app.js
:
// .start/app.js
const providers = [
'@adonisjs/redis/providers/RedisProvider'
]
NOTA
A configuração do Redis é salva dentro do arquivo config/redis.js
, que é criado pelo comando adonis install
ao instalar o Provedor Redis.
Exemplo básico
Vamos começar com um exemplo básico de cache de usuários dentro do Redis:
// .app/Controllers/Http/UserController.js
'use strict'
const Redis = use('Redis')
const User = use('App/Models/User')
class UserController {
async index () {
const cachedUsers = await Redis.get('users')
if (cachedUsers) {
return JSON.parse(cachedUsers)
}
const users = await User.all()
await Redis.set('users', JSON.stringify(users))
return users
}
}
NOTA
O exemplo acima pode não ser a melhor maneira de armazenar dados em cache – ele simplesmente fornece uma ideia de como usar o Redis.
Comandos
Todos os comandos do Redis são suportados como funções JavaScript, por exemplo:
const Redis = use('Redis')
const user = {
username: 'foo',
email: 'foo@bar.com'
}
// set user
await Redis.hmset('users', user.username, JSON.stringify(user))
// get user
const user = await Redis.hmget('users', user.username)
Pub/Sub
O Redis tem suporte integrado para publicar/assinar (pub/sub) para compartilhar mensagens no mesmo servidor ou em vários servidores.
O AdonisJs oferece uma API limpa sobre o pub/sub do Redis para assinar diferentes eventos e agir sobre eles.
Defina seus assinantes do Redis no arquivo start/redis.js
:
// .start/redis.js
'use strict'
const Redis = use('Redis')
Redis.subscribe('music', async (track) => {
console.log('received track', track)
})
OBSERVAÇÃO
Crie o arquivo start/redis.js
se ele não existir e carregue-o dentro do seu server.js
: .preLoad('start/redis')
.
Depois que um assinante for registrado, você pode publicar dados neste canal do mesmo servidor ou de um servidor diferente:
const Redis = use('Redis')
Redis.publish('music', track)
Métodos disponíveis
Abaixo está a lista de métodos para interagir com a camada pub/sub do Redis.
OBSERVAÇÃO
Você só pode ter um assinante para um determinado canal.
subscribe(channel, listener)
Redis.subscribe('music', (track) {
console.log(track)
})
Você também pode passar uma referência file.method
do diretório app/Listeners
:
Redis.subscribe('music', 'Music.newTrack')
// .app/Listeners/Music.js
'use strict'
const Music = exports = module.exports = {}
Music.newTrack = (track) => {
console.log(track)
}
psubscribe(pattern, listener)
Assinar um padrão:
Redis.psubscribe('h?llo', function (pattern, message, channel) {
})
Redis.publish('hello')
Redis.publish('hallo')
publish(channel, message)
Publicar mensagem em um canal fornecido:
Redis.publish('music', JSON.stringify({
id: 1,
title: 'Love me like you do',
artist: 'Ellie goulding'
}))
unsubscribe(channel)
Cancelar inscrição de um canal fornecido:
Redis.unsubscribe('music')
punsubscribe(channel)
Cancelar inscrição de um canal fornecido padrão:
Redis.punsubscribe('h?llo')
Conexões múltiplas
Você pode definir a configuração para várias conexões dentro do arquivo config/redis.js
e pode usar essas conexões chamando o método connection
:
// .config/redis.js
module.exports = {
connection: 'local',
local: {
...
},
secondary: {
host: 'myhost.com',
port: 6379
}
}
connection(name)
Use uma conexão diferente para fazer consultas Redis:
await Redis
.connection('secondary')
.get('users')
// hold reference to connection
const secondaryConnection = Redis.connection('secondary')
await secondaryConnection.get('users')
quit(name)
O Provedor Redis cria um pool de conexões para reutilizar conexões existentes.
Você pode encerrar uma conexão chamando o método quit
passando uma única conexão ou matriz de conexões:
await Redis.quit('primary')
await Redis.quit(['primary', 'secondary'])