# Mettre une lecture en cache

> Objectif : servir une lecture stable (catalogue, référentiel) sans aller-retour vers l'amont - sans jamais servir à un appelant ce qui a été répondu à un autre.

Guide - Depuis la version 1.2.0 - Flexway v1.6.3 - https://flexway.io/docs/operations-cache/

> Guide d'exploitation : configurer, déployer et observer la passerelle. Ce que fait la capacité côté produit : [guide produit](https://flexway.io/docs/product-overview/) ; l'appeler : [guide développeur](https://flexway.io/docs/developer-overview/).

**Objectif** : servir une lecture stable (catalogue, référentiel) sans aller-retour vers l'amont -
sans jamais servir à un appelant ce qui a été répondu à un autre.

**Commande** - au contrat, sur l'opération :

```yaml
paths:
  /products:
    get:
      x-flexway-cache: { ttl: 60s }                   # public : les appelants anonymes
  /me/cart:
    get:
      security: [ { customers: [] } ]
      x-flexway-cache: { ttl: 30s, scope: subject }   # une entrée par tenant et par sujet
```

ou, pour un ensemble de routes, une politique `cache` - toujours publique :

```yaml
policies:
  definitions:
    catalog-cache: { type: cache, config: { ttl: 5m } }
  chains:
    routes: { "/products/**": [catalog-cache] }
```

**Vérif** : la deuxième requête répond `Flexway-Cache: hit` et un `Age`, sans que l'amont la voie ;
`flexway_cache_lookups_total{result="hit"}` monte ; `/config` montre `cache` dans le catalogue, la
console une pastille « en cache ». Un `If-None-Match` qui correspond à l'`ETag` gardé reçoit un
`304` du cache.

| Règle | Ce qu'elle veut dire |
| --- | --- |
| Rien par défaut | Une opération sans `x-flexway-cache` ni politique `cache` n'est jamais cachée ; l'opération l'emporte sur la politique |
| L'amont raccourcit | Durée = le plus court du `ttl` et de `max-age`, `s-maxage` ou `Expires` ; `no-store`, `no-cache`, `private`, `Set-Cookie` : jamais gardé |
| Longueur connue | Une réponse sans `Content-Length` est un flux pour la passerelle : relayée sans tampon, jamais gardée |
| Un succès compte | Débit et quota sont comptés avant la lecture du cache : il épargne l'amont, jamais l'allocation de l'appelant |
| Identité | Un appelant identifié ne lit ni ne nourrit un cache public ; un cache authentifié se déclare à l'opération (`scope: subject`), clé tenant **et** sujet |
| Refusé au chargement | Un cache sur un flux, un WebSocket, une méthode gRPC, l'inférence, une écriture ; public sur une opération qui exige une identité - le message nomme l'opération |
| Mémoire | Par réplique, bornée : `server.cache.max_bytes` (32 Mio), `server.cache.max_entry_bytes` (1 Mio) ; non rechargeable ; un rechargement purge |

Exemple complet : [Cache de réponses](https://flexway.io/docs/operations-examples-gateway/#cache-de-r%C3%A9ponses).
