Implementando o Redis de forma elegante com Nodejs e ioredis

Richard Henrique
3 min readJun 21, 2020

A primeira coisa que vamos fazer é montar uma arquitetura separando as camadas de aplicação, negócio, testes, etc.

Caso queira utilizar a estrutura atual do seu projeto, beleza, se não, ao final do artigo disponibilizo um repositório base que estou criando.

Supondo que já estamos com nossa arquitetura construida, podemos começar instalando o ioredis com o comando npm install ioredis --save.

Feito isto, dentro da camada de databases ou onde fazer sentido para sua aplicação, vamos criar um arquivo que exportará nossa classe RedisClient contendo nossa instância do Redis e suas funções.

Decidi não utilizar o pacote redis, porque ele não retorna as funções promissificadas, sendo necessário a utilização do promisify.

Primeiro extraio os dados de conexão do meu banco port, host e db das minhas configurações de váriaveis de ambiente.

Construi um arquivo para me auxiliar com valores que se repetem por toda aplicação, dentro dele crio uma propriedade chamada expireIn que contém o tempo default de expiração das chaves do Redis, portanto, extraio esse dado igual faço com as váriaveis de ambiente.

Em seguida começo a construção da minha classe, passando para meu construtor os dados de conexão do Redis.

Depois começo a construção das funções principais do Redis.

Lembrando que o Redis é um banco não relacional que trabalha com Chave e Valor, a chave é o id daquele registro dentro do banco e o value é o dado que será inserido. Portanto, você precisa dar nomes inteligentes para as chaves de dados no Redis, caso contrário, o gerenciamento desses dados será dificil.

Funções

GET -> Invoco o get do Redis instanciado, passando a chave que recebo como parâmetro. Assim que tenho um retorno do banco, converto em JSON e retorno para quem está consumindo essa classe, no meu caso o Service.
Observe que retorno null caso ocorra algum erro, pois assim conseguimos fazer um controle para chamarmos nosso banco de dados principal como contingência.

DEL -> Sem muito segredo, recebo uma chave por parâmetro e invoco o delete do Redis, apagando o registro.

SET -> Recebo uma chave e um valor que serão registrados no Redis, converto o value em string (O redis não irá salvar outro tipo) e invoco o set do Redis, informando que meu EX -> expire será de vinte e quatro horas, ou o que foi informado via parâmetro.

KEYS -> Essa função irá me retornar uma ou mais chaves do Redis, se eu passar um identificador único, retornará apenas uma chave caso ela exista. Se passar um pattern, irá trazer todos os registros que atendam esse pattern.

DELETE KEYS BY MATCHING PATTERN -> Como o próprio nome diz, essa função é responsável por apagar as keys do Redis que atendam determinado pattern. Para definirmos um pattern, basta digitar iniciais da key mais asterisco, por exemplo userId:123456:*, essa key irá apagar todos os registros do usuário 123456.

Em seguida apenas exporto a classe.

Instanciando o Redis

Com base no Pattern Factory, criei um arquivo que será o responsável por instanciar minhas classes, após instanciar o Redis, injeto ele dentro do Service.
Observe que também utilizo o Singleton Pattern em dois pontos, um na declarativa do redis e outro quando instancio a classe UserFactory no modules.exports.

Agora fazendo uma pequena demonstração de como poderiamos consumir o Redis na prática, criei um Service de usuários, onde verifico se existe uma listagem de usuários salvos no Redis, se não, chamo o repository para fazer a chamada no banco de dados.

Notem que criei no enumHelper uma função para me auxiliar na construção da key, caso a invoque passando um ID por parâmetro, subentende-se que quero apenas o retorno de um usuário, então faço uma concatenação de ação + id, se não, crio um pattern para retornar a listagem de todos os usuários.

Também temos a propriedade expireIn, já mencionada no inicio do artigo.

Por último criei uma propriedade de actions, para organizar em um único ponto da aplicação as ações que o Redis irá atender.

Está é uma demonstração de como podemos invocar os outros métodos e qual será o retorno.

Facil não?

Documentação do Redis

Código fonte

--

--