# Cache

import DocButton from '~/components/webkit/DocButton.vue';

**Cache** é um módulo disponível para **Applications** que permite que você configure como sua aplicação faz o cache de conteúdo, reduzindo a latência e aumentando a taxa de transferência através da edge network da Azion. Isso não apenas melhora o desempenho e a escalabilidade do seu conteúdo, mas também reduz os custos de infraestrutura.

Na Azion, você pode personalizar o tempo que o cache permanece no edge através dos valores de *time-to-live* (TTL). Políticas de cache com valores maiores de TTL podem otimizar o desempenho de sua aplicação, melhorando a experiência de seus usuários e reduzindo o tráfego com a origem. No entanto, um TTL de cache baixo pode ajudá-lo a garantir que os usuários finais sempre vejam as informações mais atuais.

Se os servidores de origem estiverem inativos ou ficarem indisponíveis, o Cache da Azion também pode servir conteúdo do cache para seus usuários a partir do edge.

## Implementação

| Escopo | Recursos |
| --- | --- |
| Configurações de cache disponíveis | [Cache Settings](/pt-br/documentacao/produtos/build/applications/cache-settings/) |
| Módulo Tiered Cache | [Tiered Cache](/pt-br/documentacao/produtos/build/applications/cache/tiered-cache/) |
| Configurar uma política de cache | [Como configurar políticas de cache para Applications](/pt-br/documentacao/produtos/guias/cache-settings/) |

---

## Status de cache

A Azion fornece uma camada para armazenar conteúdo em cache na edge network, que atua entre os servidores de origem e o usuário final. Quando o conteúdo é armazenado em cache, ele recebe o [cache status HIT](#definicoes-de-status) e pode ser entregue diretamente aos seus usuários a partir do edge node mais próximo a eles, reduzindo a frequência de acesso aos seus servidores de origem. 

Quando o conteúdo requisitado não está disponível em cache, o módulo **Cache** da Azion emprega estratégias para minimizar o impacto no servidor de origem e otimizar a entrega de conteúdo. Uma dessas estratégias inclui manter conexões keep-alive com o servidor de origem sempre que possível, para reduzir a sobrecarga associada a handshakes TCP/IP frequentes. Isso é eficaz durante atualizações de cache ou em situações de um [cache MISS](#definicoes-de-status). 

Além disso, a Azion implementa o controle de Thundering Herd para garantir que, diante de múltiplas requisições simultâneas para o mesmo objeto não armazenado em cache, apenas uma conexão seja estabelecida com o servidor de origem. Essa abordagem garante que cada um dos edge nodes da Azion solicite conteúdo ao servidor de origem apenas uma vez por MISS ou outros status não-HIT, otimizando, assim, a eficiência da rede e reduzindo a carga no servidor de origem.

Você pode obter o status de qualquer recurso em cache em uma application por meio de uma requisição para a URI do conteúdo, adicionando o cabeçalho de debug da Azion `Pragma: azion-debug-cache`. Uma resposta bem-sucedida retornará um cabeçalho `X-Cache` com o status do cache, o IP do edge node de qual foi retirado e o protocolo utilizado:

```bash
X-Cache: HIT from 200.000.000.00 with HTTP/2.0
```

:::note
Saiba mais sobre como automatizar seu navegador para obter outros dados de cache no guia [Como verificar indicadores de cache usando Modheader para Google Chrome](/pt-br/documentacao/produtos/guias/verificar-tempo-de-cache-da-pagina/).
:::

### Definições de status

| Status | Definição |
| --- | --- |
| **HIT** | Conteúdo válido e atualizado é fornecido diretamente do cache do edge |
| **MISS** | Se o conteúdo da requisição não for encontrado no cache no edge, ele é buscado na origem. Por meio da resposta, o conteúdo pode ser armazenado em cache no edge para futuras requisições |
| **EXPIRED** | O conteúdo em cache expirou o TTL definido no edge. Quando a origem responde, o conteúdo em cache é atualizado para futuras requisições |
| **STALE** | Ao optar por servir [stale cache](#stale-cache), se a origem falhar em responder e o cache edge expirou, uma versão obsoleta do conteúdo é servida |
| **UPDATING** | O conteúdo em cache expirou e o stale cache está sendo servido, mas o conteúdo será atualizado para futuras requisições |
| **REVALIDATED** | O conteúdo em cache é verificado contra o da origem usando cabeçalhos condicionais. Se ainda estiver atualizado, o recurso não é retransmitido pela origem |
| **BYPASS** | O edge solicita o conteúdo diretamente da origem em vez de usar uma versão em cache devido ao comportamento [Bypass Cache](/pt-br/documentacao/produtos/build/applications/rules-engine/#bypass-cache) |
| **-** | Se nenhum status for recebido, o conteúdo do request está restrito de permanecer em cache. Por exemplo, se o conteúdo é uma requisição `POST` e [Caching for POST](/pt-br/documentacao/produtos/build/applications/cache-settings/#cache-de-metodos-http) está desabilitado, o status não é recebido |

---

## Cache keys

Uma cache key é uma entrada de índice para um objeto nos edge nodes da Azion. Quando uma requisição é feita para uma application pela primeira vez, o edge encaminha a requisição para o servidor de origem e gera um cache para cada objeto recebido. Quando a próxima requisição do mesmo recurso é feita para a application, se o recurso solicitado corresponder a um já encontrado por meio da cache key, a requisição não será encaminhada para a origem.

Você pode obter a cache key de qualquer recurso em uma application por meio de uma requisição para a URI do conteúdo, adicionando o cabeçalho de debug da Azion `Pragma: azion-debug-cache`. Uma resposta bem-sucedida retornará um cabeçalho `X-Cache-Key` com o valor da cache key:

```
X-Cache-Key: httpsseudominio.com/caminho-do-recurso/imagem.jpeg@@
```

:::note
Saiba mais sobre como automatizar seu navegador para obter outros dados de cache no guia [Como verificar indicadores de cache usando Modheader para Google Chrome](/pt-br/documentacao/produtos/guias/verificar-tempo-de-cache-da-pagina/).
:::

### Formato da cache key

O formato padrão da cache key adotado pela Azion concatena os seguintes elementos de sintaxe da URI:

- Schema da requisição
- Host
- Path do recurso
- Query strings
- Um separador de variação e, quando implementadas, variações

Um objeto com a URI `https://static.seudominio.com/pagina/site.js` deveria gerar a cache key `httpsstatic.seudominio.com/pagina/site.js`. 

Cache keys são case-sensitive, o que significa que caracteres em maiúsculo e minúsculo são reconhecidos como distintos.

Algumas cache keys também podem mudar dependendo de variações geradas no edge. Usando o exemplo anterior, se variações forem habilitadas, a cache key poderá conter o marcador `@@` no final, resultando em `httpsstatic.seudominio.com/pagina/site.js@@`.

#### Requisições complexas

Se o recurso é obtido usando uma requisição complexa (qualquer método diferente de `GET` ou `HEAD`), o método é adicionado no início da cache key. 

Por exemplo, para uma requisição `OPTIONS`, a cache key gerada para um objeto seria `optionshttpsstatic.seudominio.com/pagina`.

#### Image Processor

Quando o [Image Processor](/pt-br/documentacao/produtos/build/applications/image-processor/) está ativado, além da query string `ims`, variações com formato convertido contêm o formato do arquivo após o separador.

Por exemplo, para uma imagem redimensionada e convertida no formato `webp`, a cache key gerada será `httpsstatic.seudominio.com/static/imagens/imagem_1.jpg?ims=880x@@webp`.

#### Device Groups

Se houver uma variação de objetos por [device groups](/pt-br/documentacao/produtos/build/applications/device-groups/), o separador `@@` e o nome do device group serão acrescentados ao final. 

Por exemplo, para uma aplicação que implementa variação pelo grupo `Mobile`, a cache key gerada será `httpwww.seudominio.com/@@Mobile`.

#### Advanced Cache Key

Quando a funcionalidade [Advanced Cache Key](/pt-br/documentacao/produtos/build/applications/application-accelerator/#advanced-cache-key) estiver configurada, a formação das cache keys também é afetada.

**Cache by Cookie** gera uma variação de cache key com os nomes e valores do cookie determinados seguidos por `;`. 

Por exemplo, a variação de conteúdo com base no cookie `usuário` poderia gerar as seguintes cache keys:

- `httpwww.seudominio.com/@@;`
- `httpwww.seudominio.com/@@user=usuario;`

**Cache by Query String** gera cache keys com o separador de consulta e os argumentos determinados com base na ordem das strings de consulta submetidas na requisição. 

Por exemplo, a variação de conteúdo com base em `nome` e `cidade` poderia gerar as seguintes cache keys:

- `httpstatic.seudominio.com/pagina?name=nome`
- `httpstatic.seudominio.com/pagina?city=cidade&name=nome`
- `httpstatic.seudominio.com/pagina?name=nome&city=cidade`

Para várias query strings, se **Query string sort** estiver ativado, as strings de consulta serão agrupadas sob a mesma cache key, ordenadas alfabeticamente.

#### Large File Optimization

Para fragmentação de arquivos, a cache key acrescenta o separador `@@bytes=` para cada fragmento de conteúdo. 

Por exemplo, para um arquivo de `2097151` bytes de tamanho, se Large File Optimization estiver ativado, as cache geradas serão:

- `httpstatic.seudominio.com/midia/arquivo.mp4@@bytes=0-1048575`
- `httpstatic.seudominio.com/midia/arquivo.mp4@@bytes=1048576-2097151`

#### Métodos HTTP em cache

Para solicitações `POST` ou `OPTIONS` em cache com corpo, a cache key acrescenta o separador `@@` seguido pelo hash MD5 do corpo da requisição. 

Por exemplo:

- `httpsdynamic.seudominio.com/caminho@@md5_dos_argumentos_post`
- `httpsdynamic.seudominio.com/caminho@@md5_dos_argumentos_options`

---

## Expiration settings

Com o **Cache**, você pode personalizar o TTL (*Time-to-Live*) de cache do navegador e do edge de acordo com seus requisitos específicos.

Ao definir seu TTL para o cache do navegador, você pode controlar por quanto tempo o conteúdo permanece armazenado nos navegadores locais. Um valor maior de TTL pode reduzir a necessidade de seus usuários buscarem conteúdo dos edge nodes ou da origem, melhorando os tempos de carregamento.

Você também pode definir por quanto tempo seu conteúdo deve permanecer em cache nos edge nodes da Azion. Um TTL de CDN cache mais longo pode melhorar o desempenho de entrega de conteúdo. Sendo acessado com frequência, o conteúdo permanece disponível mais perto dos usuários, reduzindo a carga no servidor da origem. 

Encontrar o equilíbrio certo para os tempos de expiração de cache é crucial para garantir que os usuários recebam o conteúdo mais atualizado sem servir stale cache por muito tempo.

A capacidade de personalizar o TTL de cache do navegador e o TTL de cache do edge permite que você ajuste sua estratégia de cache com base na frequência de atualização do seu conteúdo, nos padrões de tráfego do usuário e nos objetivos gerais de desempenho.

<DocButton href="/pt-br/documentacao/produtos/build/applications/cache-settings/#browser-cache-settings" label="Saiba mais sobre expiration settings" size="medium" />

---

## Stale Cache

**Stale Cache** permite que os edge nodes da Azion continuem atendendo seus usuários com objetos previamente armazenados em cache, mesmo após a expiração dos mesmos, evitando indisponibilidades ou páginas de erro enquanto o conteúdo atualizado é buscado na origem.

### Como funciona

1. Quando a opção **Enable Stale Cache** está ativada em uma configuração de cache, toda resposta armazenada no cache pode ser reutilizada se uma tentativa de revalidação falhar devido a:
   - Erros 5xx retornados pela origem.
   - Timeout de conexão ou indisponibilidade da origem.
   - Cabeçalhos cache-control inválidos ou ausentes.
   - O objeto sendo atualizado (revalidação em andamento).

2. O edge node primeiro procura pela diretiva `stale-while-revalidate=<ttl>`:
   - Honor Origin Cache – Se ativado e a origem fornecer `stale-while-revalidate`, esse valor define por quanto tempo o objeto pode ser servido em modo `stale`.
   - Override Cache Settings – Se este modo estiver selecionado ou a origem omitir a diretiva, a Azion atribui automaticamente uma janela padrão de stale de 300 segundos (5 minutos).
3. Durante a janela de stale, o edge node serve imediatamente a cópia expirada e busca de forma assíncrona uma versão atualizada em segundo plano. Quando o novo objeto é armazenado, as requisições subsequentes recebem o conteúdo atualizado.

---

## Adaptive Delivery

**Adaptive Delivery** detecta os grupos de dispositivos que você criou usando o [Device Groups](/pt-br/documentacao/produtos/build/applications/device-groups/), permitindo que você configure como a Azion entrega seu conteúdo. Você pode optar por fornecer a mesma versão do conteúdo, independentemente da detecção do dispositivo, ou manter variações de objetos baseadas no dispositivo em cache.

<DocButton href="/pt-br/documentacao/produtos/build/applications/cache-settings/#adaptive-delivery" label="Saiba mais sobre adaptive delivery" size="medium" />

---

## Large File Optimization

**Large File Optimization** é um recurso para **Applications** que processa grandes quantidades de dados de forma mais eficaz, reduzindo a latência e economizando em infraestrutura.

Ao habilitar essa funcionalidade, arquivos grandes são fragmentados em arquivos menores. Esses fragmentos são gradualmente entregues ao usuário final de acordo com o consumo de dados, evitando uma transferência abrupta de dados que poderia ser interrompida pelo usuário. A funcionalidade Large File Optimization armazena em cache os dados sob demanda no momento em que o usuário solicita, iniciando a operação do cache.



<DocButton href="/pt-br/documentacao/produtos/build/applications/cache-settings/#large-file-optimization" label="Saiba mais sobre configurações de large file optimization" size="medium" />

---

## Limites

:::tip
**Aumente limites** <br></br>
Você pode solicitar o aumento dos limites com base no seu plano. Contate o [time de suporte técnico](/pt-br/documentacao/servicos/suporte/) para fazer a solicitação.
:::

Estes são os **limites default**:

| Escopo | Limite |
| --- | --- |
| Tamanho de slice de arquivos | 1.024 kB |
| Tamanho de objeto único em cache | 10 GB |
| Tempo mínimo de cache TTL | 60 segundos <br></br>Para o módulo [Application Accelerator](https://www.azion.com/en/products/application-accelerator/): 0 segundos |

:::tip
**Aumente limites** <br></br>
Você pode solicitar o aumento dos limites com base no seu plano. Contate o [time de suporte técnico](https://www.azion.com/pt-br/documentacao/servicos/suporte/) para fazer a solicitação.
:::

---