Diferença entre armazenamento em sessão e cache
Tags: cache, session
Published: 2023-07-27 11:39:39

## Intro

Tanto a sessão quanto o cache são mecanismos de armazenamento temporário de dados em aplicações web, porém com propósitos diferentes.

## Sessão

A sessão é uma forma de armazenar dados temporários do usuário durante uma sessão de navegação, ou seja, enquanto o usuário estiver interagindo com a aplicação. As informações armazenadas na sessão ficam disponíveis apenas para aquele usuário específico e são mantidas no servidor. As sessões são geralmente usadas para armazenar dados de login do usuário, carrinho de compras, preferências do usuário, entre outras informações que precisam ser mantidas enquanto o usuário está navegando na aplicação.

## Cache

Já o cache é uma forma de armazenar dados temporários que são frequentemente acessados pela aplicação, com o objetivo de melhorar o desempenho e reduzir o tempo de resposta da aplicação. As informações armazenadas no cache são geralmente cópias de dados que foram buscados em algum lugar, como no banco de dados, e que são acessados com frequência. Quando a aplicação precisa dos dados novamente, ela verifica primeiro no cache antes de buscar nos locais originais. O cache pode ser armazenado no servidor ou no cliente, dependendo da configuração.

## Exemplos para sessões

Aqui estão alguns exemplos de dados que são mais adequados para serem armazenados em sessão ao invés de cache:

**Informações do usuário:** Quando um usuário faz login em uma aplicação web, suas informações de autenticação, como nome de usuário e senha, devem ser armazenadas em sessão para que a aplicação possa lembrar quem é o usuário durante toda a sessão de navegação.

**Carrinho de compras:** Quando um usuário adiciona um produto ao carrinho de compras em uma loja virtual, as informações sobre o produto, como nome, preço e quantidade, devem ser armazenadas em sessão. Isso permite que o carrinho de compras acompanhe o usuário durante toda a sessão de navegação.

**Preferências do usuário:** Se uma aplicação web permite que o usuário personalize sua experiência, como selecionar uma cor de fundo ou um idioma preferido, essas preferências devem ser armazenadas em sessão. Isso garante que as preferências do usuário sejam mantidas enquanto ele estiver navegando na aplicação.

**Dados sensíveis:** Se uma aplicação web manipula dados sensíveis, como informações médicas ou financeiras, esses dados devem ser armazenados em sessão. Isso garante que apenas o usuário autenticado tenha acesso aos dados e que eles sejam destruídos quando a sessão do usuário terminar.

Esses são apenas alguns exemplos de dados que são mais adequados para serem armazenados em sessão ao invés de cache. Em geral, qualquer dado que seja específico do usuário e precise ser mantido apenas enquanto ele estiver navegando na aplicação deve ser armazenado em sessão.

## Exemplos para cache

Aqui estão alguns exemplos de dados que são mais adequados para serem armazenados em cache ao invés de sessão:

**Dados estáticos:** Se uma aplicação web precisa exibir informações estáticas, como uma lista de países ou um conjunto de regras de negócio, esses dados podem ser armazenados em cache. Isso permite que a aplicação não precise buscar esses dados do banco de dados ou de outra fonte a cada requisição, melhorando assim o desempenho.

**Resultados de consultas:** Se uma aplicação web precisa realizar consultas frequentes em um banco de dados, os resultados dessas consultas podem ser armazenados em cache. Isso permite que a aplicação possa recuperar os resultados mais rapidamente nas próximas requisições, melhorando assim o desempenho.

**Recursos de mídia:** Se uma aplicação web precisa exibir imagens, vídeos ou outros recursos de mídia, esses recursos podem ser armazenados em cache. Isso permite que a aplicação não precise buscar esses recursos do servidor a cada requisição, melhorando assim o desempenho.

**Dados compartilhados:** Se uma aplicação web precisa compartilhar dados entre diferentes usuários, como uma lista de produtos disponíveis em uma loja virtual, esses dados podem ser armazenados em cache. Isso permite que a aplicação possa recuperar os dados mais rapidamente para cada usuário, melhorando assim o desempenho.

Esses são apenas alguns exemplos de dados que são mais adequados para serem armazenados em cache ao invés de sessão. Em geral, qualquer dado que seja comum a vários usuários ou que possa ser compartilhado entre requisições deve ser armazenado em cache.

## Melhores práticas

Para armazenamento de sessões e caches, algumas boas práticas incluem:

**Utilize um sistema de armazenamento seguro:** escolha um sistema que utilize criptografia e que tenha proteção contra ataques.

**Limite o tempo de vida das sessões e caches:** estabeleça um tempo limite para a vida útil das sessões e caches, evitando que esses dados sejam armazenados por um tempo muito longo.

**Escolha um sistema de armazenamento eficiente:** selecione um sistema de armazenamento que seja capaz de lidar com o volume de tráfego do seu site ou aplicativo.

**Faça backups regulares:** mantenha backups das sessões e caches para evitar a perda de dados em caso de falhas do sistema.

**Utilize o armazenamento em cache de forma inteligente:** utilize o cache para armazenar dados estáticos que não mudam com frequência, como arquivos de imagens ou estilos CSS.

**Limite o acesso às sessões e caches:** estabeleça políticas de acesso que limitem quem pode acessar as sessões e caches do sistema.

**Utilize um sistema de expiração de cache:** utilize um sistema que defina o tempo de expiração do cache para evitar que ele armazene dados desatualizados.

**Utilize técnicas de compressão de dados:** utilize técnicas de compressão para reduzir o tamanho dos dados armazenados em sessões e caches, economizando espaço e melhorando o desempenho do sistema.

## Prós e Contras

A melhor forma de armazenamento depende de vários fatores, como a frequência de atualização das configurações, o tempo necessário para buscar as informações da API externa e a sensibilidade das informações. Aqui estão alguns prós e contras de cada opção de armazenamento para ajudar na sua decisão.

### Armazenamento em cache

**Prós**
- Melhora o desempenho da aplicação, pois os dados ficam armazenados em memória e podem ser acessados rapidamente;
- Reduz a carga na API externa, pois as informações são recuperadas do cache em vez de serem solicitadas repetidamente;
- Pode ser configurado para expirar após um determinado período de tempo ou quando ocorrerem atualizações das configurações na API externa, garantindo que as informações estejam atualizadas;

**Contras**
- Se as configurações forem atualizadas com frequência na API externa, o cache pode não ser eficaz e pode ser necessário atualizar as informações com mais frequência;
- As informações podem não estar disponíveis imediatamente após uma atualização, já que as informações do cache precisam ser atualizadas manualmente ou quando expirarem.

### **Armazenamento em sessão**

**Prós**
- Garante que as informações sejam atualizadas em tempo real, já que as informações são buscadas da API externa a cada nova sessão;
- Permite personalização individual para cada usuário;

**Contras**
- Pode afetar o desempenho da aplicação se muitos usuários estiverem acessando a mesma API externa ao mesmo tempo;
- Pode aumentar o tempo de carregamento da página para o usuário, já que as informações precisam ser buscadas da API externa a cada nova sessão;
- Pode ser necessário um tempo de sessão muito curto para garantir que as informações sejam atualizadas com frequência, o que pode levar a uma experiência de usuário ruim.
- Em geral, se as configurações são atualizadas com frequência na API externa e as informações são sensíveis, é melhor armazená-las em sessão para garantir que elas sejam sempre atualizadas. Se as informações não são sensíveis e as atualizações são raras, o armazenamento em cache pode ser mais adequado para melhorar o desempenho da aplicação. No entanto, é importante avaliar cuidadosamente cada caso e considerar os prós e contras antes de tomar uma decisão.

## Conclusão

Em resumo, a principal diferença entre sessão e cache é que a sessão é usada para armazenar dados temporários do usuário durante uma sessão de navegação, enquanto o cache é usado para armazenar dados temporários frequentemente acessados pela aplicação, visando melhorar o desempenho.

É claro que isso aqui é apenas a lasquinha do iceberg, podemos aprofundar muito mais principalmente nas responsabilidades front e back.

## Fontes

Aqui estão algumas fontes que você pode consultar para aprender mais sobre o armazenamento em sessão e cache:

**Artigo de Alexander Nnakwue, disponível em LogRocket:** [Caching in Node.js to optimize app performance](https://blog.logrocket.com/caching-node-js-optimize-app-performance/)

**Artigo de Joseph Chege, disponível em OpenReplayBlog:** [Understanding Sessions Management And Authentication With Node.Js](https://blog.openreplay.com/sessions-management-and-authentication-with-node/)

**Artigo do Blog da AWS sobre cache em aplicações web, disponível em:** https://aws.amazon.com/pt/caching/

**Livro "High Performance Web Sites" de Steve Souders**, que aborda técnicas de otimização de desempenho, incluindo o uso de cache: [High Performance Web Sites [BOOK]](https://www.oreilly.com/library/view/high-performance-web/9780596529307/)