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/redisEm 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'])