# Primeiros passos com Cache

Este guia orienta você a colocar em cache um path da sua aplicação pela primeira vez. No fim, você vai ter:

- Um cache setting que mantém uma cópia de cada resposta por 300 segundos.
- Uma regra do [Rules Engine](/pt-br/documentacao/plataforma/applications/rules-engine/) que aplica o setting a um prefixo de path.
- O status de cache de uma resposta, lido no seu header `x-cache`.

O resultado se apoia em quatro objetos, nesta ordem. A **aplicação** carrega o módulo [Cache](/pt-br/documentacao/plataforma/applications/#cache), que está ativo em cada aplicação. O **cache setting** pertence à aplicação e carrega o TTL, o tempo que a Azion mantém uma cópia. A **regra**, também na aplicação, casa requisições por path e aplica o setting pelo behavior **Set Cache Policy**. Uma **requisição** que casa é respondida pela cópia armazenada quando existe uma, e a sua resposta carrega o `x-cache` com `HIT`. Enquanto uma regra não o nomear, um cache setting não faz nada.

---

Selecione a interface que você vai usar. Os pré-requisitos e todas as etapas abaixo seguem essa escolha.

## Pré-requisitos

- Uma aplicação que já entrega conteúdo em um domínio. Para criar uma, consulte [Primeiros passos com Applications](/pt-br/documentacao/plataforma/applications/primeiros-passos/).
- A URL de um objeto estático que a aplicação entrega, como uma imagem, para verificar no fim.
- O `curl` na sua máquina, para a verificação do status de cache no fim.

**Console**

- Acesso ao Azion Console. Para entrar, consulte [Como acessar o Azion Console](/pt-br/documentacao/guias/plataforma/conta-e-billing/como-acessar-o-azion-console/).

**CLI**

- A [Azion CLI](/pt-br/documentacao/devtools/cli/) instalada e autorizada.

**API**

- Um [personal token](/pt-br/documentacao/guias/plataforma/conta-e-billing/personal-tokens/).

---

## Crie um cache setting

Um cache setting carrega por quanto tempo a Azion mantém uma cópia de uma resposta. Este mantém cada cópia por 300 segundos.

**Console**

Para criar o cache setting pelo Azion Console:

1. **Abra a aplicação**

   Acesse [Azion Console](https://console.azion.com/) > **Applications** e selecione a aplicação que entrega o seu conteúdo.

2. **Vá para a aba Cache Settings**

3. **Selecione + Cache**

4. **Nomeie o cache setting**

   Em **Name**, insira `static-assets`.

5. **Mantenha Override cache behavior selecionado**

   Em **Cache**, mantenha *Override cache behavior* selecionado. Com essa opção, o **Max Age** substitui o TTL enviado pela origem.

6. **Defina o Max Age**

   Em **Max Age**, substitua `60` por `300`.

7. **Selecione Save**

O novo setting aparece na lista de **Cache Settings**, que mostra o seu **Name**, **ID**, **Browser Cache** e **Cache**.

**CLI**

Para criar o cache setting com a Azion CLI, substitua `<application_id>` pelo ID da sua aplicação:

1. **Salve o corpo da requisição**

   O comando lê o setting de um arquivo JSON. Salve este corpo como `cache-setting.json`:

   ```json
   {
     "name": "static-assets",
     "browser_cache": { "behavior": "honor" },
     "modules": {
       "cache": {
         "behavior": "override",
         "max_age": 300
       }
     }
   }
   ```

2. **Execute o comando de criação**

   ```bash
   azion create cache-setting --application-id <application_id> --file cache-setting.json
   ```

   O comando confirma o setting e retorna o seu ID:

   ```text
   Created Cache Settings configuration with ID 123460
   ```

3. **Leia o setting de volta**

   Substitua `123460` pelo ID que o comando de criação retornou:

   ```bash
   azion describe cache-setting --application-id <application_id> --cache-setting-id 123460 --format json
   ```

   A saída reporta o `modules.cache.max_age` como `300`.

O cache setting existe na aplicação. Registre o seu ID: a regra da próxima etapa o nomeia.

> **nota**
>
> As flags do comando não definem o **Max Age**, o comportamento de cache, o stale cache, a Large File Optimization nem o Tiered Cache. Passe o corpo da requisição com `--file` para esses campos. Para todas as flags que o comando aceita, consulte [Azion CLI create](/pt-br/documentacao/devtools/cli/recursos/).

**API**

Para criar o cache setting com a Azion API, substitua `[TOKEN VALUE]` pelo seu personal token e `<application_id>` pelo ID da sua aplicação:

1. **Envie a requisição de criação**

   ```bash
   curl --request POST \
     --url https://api.azion.com/v4/workspace/applications/<application_id>/cache_settings \
     --header 'Accept: application/json' \
     --header 'Authorization: Token [TOKEN VALUE]' \
     --header 'Content-Type: application/json' \
     --data '{
     "name": "static-assets",
     "browser_cache": { "behavior": "honor" },
     "modules": {
       "cache": {
         "behavior": "override",
         "max_age": 300
       }
     }
   }'
   ```

2. **Leia a resposta**

   Um `201` carrega o setting, com cada campo que a requisição deixou de fora preenchido pelo seu padrão:

   ```json
   {
     "state": "executed",
     "data": {
       "id": 123459,
       "name": "static-assets",
       "browser_cache": { "behavior": "honor", "max_age": 0 },
       "modules": {
         "cache": {
           "behavior": "override",
           "max_age": 300,
           "stale_cache": { "enabled": false },
           "large_file_cache": { "enabled": false, "offset": 1024 },
           "tiered_cache": { "enabled": false }
         }
       }
     }
   }
   ```

O cache setting existe na aplicação. Registre o `id`: a regra da próxima etapa o nomeia.

> **nota**
>
> Um **Max Age** abaixo de 60 segundos exige o módulo [Application Accelerator](/pt-br/documentacao/plataforma/applications/#application-accelerator) na aplicação.

---

## Aplique o setting com uma regra

Um cache setting não faz nada enquanto uma regra não o nomear. Esta regra aplica o `static-assets` a cada requisição cujo path casa com um prefixo que você escolhe.

**Console**

Para criar a regra pelo Azion Console:

1. **Vá para a aba Rules Engine**

2. **Selecione + Rule**

3. **Nomeie a regra**

   Insira um nome como `cache-static-assets`.

4. **Selecione Request Phase**

5. **Defina os criteria**

   Em **Criteria**, selecione `${uri}` e um operador. Como argumento, insira o prefixo de path a colocar em cache, como `/static/`.

6. **Adicione o behavior Set Cache Policy**

   Em **Behaviors**, selecione **Set Cache Policy** e depois selecione `static-assets`.

7. **Selecione Save**

A regra aparece na lista e aplica o `static-assets` a cada requisição cujo path casa com os seus criteria.

**CLI**

Para criar a regra com a Azion CLI, substitua `<application_id>` pelo ID da sua aplicação:

1. **Salve o corpo da requisição**

   Os criteria carregam `${uri}`, que um shell expande, então a regra vai em um arquivo. Salve este corpo como `rule.json` e substitua `123460` pelo ID do cache setting da etapa anterior:

   ```json
   {
     "name": "cache-static-assets",
     "active": true,
     "criteria": [
       [
         {
           "conditional": "if",
           "variable": "${uri}",
           "operator": "starts_with",
           "argument": "/static/"
         }
       ]
     ],
     "behaviors": [
       {
         "type": "set_cache_policy",
         "attributes": { "value": 123460 }
       }
     ]
   }
   ```

2. **Execute o comando de criação**

   ```bash
   azion create rules-engine --application-id <application_id> --phase request --file rule.json
   ```

   O comando confirma a regra e retorna o seu ID:

   ```text
   Created Rules Engine with ID 234570
   ```

A regra existe na aplicação e aplica o `static-assets` a cada requisição cujo path começa com `/static/`.

**API**

Para criar a regra com a Azion API, substitua `[TOKEN VALUE]` pelo seu personal token e `<application_id>` pelo ID da sua aplicação:

1. **Salve o corpo da requisição**

   Os criteria carregam `${uri}`, que um shell expande, então o corpo vai em um arquivo em vez da linha de comando. Salve este corpo como `rule.json` e substitua `123459` pelo ID do cache setting da etapa anterior:

   ```json
   {
     "name": "cache-static-assets",
     "active": true,
     "criteria": [
       [
         {
           "conditional": "if",
           "variable": "${uri}",
           "operator": "starts_with",
           "argument": "/static/"
         }
       ]
     ],
     "behaviors": [
       {
         "type": "set_cache_policy",
         "attributes": { "value": 123459 }
       }
     ]
   }
   ```

2. **Envie a requisição de criação**

   ```bash
   curl --request POST \
     --url https://api.azion.com/v4/workspace/applications/<application_id>/request_rules \
     --header 'Accept: application/json' \
     --header 'Authorization: Token [TOKEN VALUE]' \
     --header 'Content-Type: application/json' \
     --data @rule.json
   ```

3. **Leia a resposta**

   Um `202` carrega a regra, e o state `pending` significa que a plataforma ainda está aplicando-a:

   ```json
   {
     "state": "pending",
     "data": {
       "id": 234569,
       "name": "cache-static-assets",
       "active": true,
       "behaviors": [
         {
           "type": "set_cache_policy",
           "attributes": { "value": 123459 }
         }
       ],
       "order": 2
     }
   }
   ```

A regra existe na aplicação e aplica o `static-assets` a cada requisição cujo path começa com `/static/`.

> **nota**
>
> Uma regra nova pode levar alguns minutos para propagar. Aguarde antes de verificar o status de cache.

---

## Verifique o status de cache

O header de requisição `Pragma: azion-debug-cache` faz a resposta carregar dois headers de debug. O `x-cache` carrega o status de cache, o IP do servidor que respondeu e o protocolo. O `x-cache-key` carrega a key que indexa a cópia.

1. **Requisite o objeto com o header de debug**

   Requisite um objeto sob o path que a regra casa, com o seu próprio host e path:

   ```bash
   curl -sI -H "Pragma: azion-debug-cache" https://www.example.com/static/site.js
   ```

2. **Leia o status de cache**

   A resposta carrega os dois headers de debug. Em HTTP/2, os nomes dos headers chegam em minúsculas:

   ```http
   x-cache: MISS from 192.0.2.10 with HTTP/2.0
   x-cache-key: httpswww.example.com/static/site.js
   ```

   `MISS` significa que o objeto não estava no cache: a Azion o buscou na origem e pode armazenar a resposta.

3. **Execute o mesmo comando novamente**

4. **Leia o status de cache novamente**

   Uma resposta entregue pela cópia armazenada carrega `HIT`. O `x-cache` também nomeia o servidor que respondeu.

A sua aplicação agora mantém uma cópia de cada resposta que casa por 300 segundos. O `x-cache` informa quando uma resposta veio dessa cópia. Uma resposta também pode carregar outro status, como `REVALIDATED`. Para cada valor de status, consulte [Cache keys](/pt-br/documentacao/plataforma/applications/cache/cache-keys/).

---

## Próximos passos

- [Expiração e atualização](/pt-br/documentacao/plataforma/applications/cache/expiracao-e-atualizacao.md): Como uma requisição encontra uma cópia armazenada, como o TTL a expira e o que o stale cache faz quando a origem falha.
- [Cache settings](/pt-br/documentacao/plataforma/applications/cache/cache-settings.md): Todos os campos que um cache setting carrega, incluindo o TTL de browser e o stale cache.
- [Crie um cache setting](/pt-br/documentacao/guias/performance-e-confiabilidade/cache-e-purge/ajustar-cache-settings.md): O mesmo cache setting e a mesma regra pela Azion API e pela Azion CLI.
- [Purgue conteúdo em cache](/pt-br/documentacao/guias/performance-e-confiabilidade/cache-e-purge/purgar-conteudo-em-cache.md): Remova uma cópia armazenada antes do fim do seu TTL, por URL, cache key ou wildcard.
- [Limites de Applications](/pt-br/documentacao/plataforma/applications/limites.md#cache): Os limites de valores de TTL, nomes de cache setting, tamanho de objeto e requisições de purge.
- [Solucionar problemas de Applications](/pt-br/documentacao/plataforma/applications/solucao-de-problemas.md#cache): O que verificar quando uma resposta não é entregue pelo cache.
