Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Redis retorna 2 registros

Ao implementar a funcionalidade para salvar a requisição GET do produto por id, meu redis está salvando a rota padrao e minha configuração, o q pode ser?

//produto.controller.ts

@Get('/:id')
  @UseInterceptors(CacheInterceptor)
  async getById(@Param('id') id: string) {
    const key = `Produto: ${id}`;
    const produto = await this.cacheManager.get(key);
    if (produto) {
      return produto;
    }
    const produtoEncontrado = await this.produtoService.getProductById(id);
    await this.cacheManager.set(key, produtoEncontrado);
    return {
      mensagem: 'Produto encontrado com sucesso',
      produtoEncontrado,
    };
  }
  
  //app.module.ts
  CacheModule.registerAsync({
      useFactory: async () => ({
        store: await redisStore({
          ttl: 3600 * 1000, // 1 hour
        }),
      }),
      isGlobal: true,
    })

Foto do redis.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A requisição segue normal. Os arquivos salvos são: um objeto com a mensagem e o outro sem.

2 respostas
solução!

Olá Davidson! Como vai?

O que está acontecendo é que o CacheInterceptor do Nest.js está automaticamente armazenando em cache a resposta completa da sua rota, que inclui a mensagem e o produto. Isso explica por que você está vendo dois registros no Redis: um com a chave personalizada que você criou (Produto: ${id}) e outro com a chave padrão gerada pelo CacheInterceptor.

Para resolver isso e armazenar apenas o produto no cache, você pode modificar seu código para controlar manualmente o que é armazenado. Veja como você pode fazer isso:

//produto.controller.ts

@Get('/:id')
async getById(@Param('id') id: string) {
  const key = `Produto: ${id}`;
  const produto = await this.cacheManager.get(key);
  if (produto) {
    return {
      mensagem: 'Produto encontrado com sucesso',
      produtoEncontrado: produto,
    };
  }
  const produtoEncontrado = await this.produtoService.getProductById(id);
  await this.cacheManager.set(key, produtoEncontrado);
  return {
    mensagem: 'Produto encontrado com sucesso',
    produtoEncontrado,
  };
}

Dessa forma, você está garantindo que apenas o objeto produtoEncontrado seja armazenado no cache, enquanto a mensagem é gerada dinamicamente a cada requisição.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Deu certo, agora retornou apenas o registro que configurei, obrigado. 0/