Cache
Le cache sert aux valeurs que vous pouvez vous permettre de perdre et de recalculer : un calcul coûteux, une réponse d'API tierce. Chaque valeur a une durée de vie (TTL) et expire ensuite. Pour les données qui doivent durer, utilisez le KV store.
API
Le framework fournit createCache, importé depuis @bext-stack/framework/kv. Il fonctionne sur
tout store qui implémente CacheStore (get, set, delete). Le store kvStore enregistre les
valeurs dans le KV de votre application :
import { createCache, kvStore } from "@bext-stack/framework/kv";
// Shared across requests, scoped to your app, stored in KV with its TTL
const cache = createCache({ store: kvStore({ appId: "<app-id>" }), prefix: "rates" });
const rates = await cache.remember("eur", 300, () => fetchRates("EUR")); // TTL in seconds
await cache.put("flag", true, 60);
await cache.get<boolean>("flag"); // true | null
await cache.forget("flag");
Les valeurs sont encodées en JSON : vous mettez en cache des objets typés, pas seulement des
chaînes. Elles doivent donc être sérialisables en JSON (une Date revient sous forme de chaîne).
| Méthode | Description |
|---|---|
get<T>(key) |
Lire une valeur, ou null si elle est absente ou expirée. |
put(key, value, ttlSecs?) |
Écrire une valeur. Sans TTL (ou avec 0), elle n'expire pas. |
remember(key, ttlSecs, factory) |
Lire la valeur, ou la calculer avec factory, la stocker et la retourner. |
has(key) |
Indiquer si une valeur est présente. |
forget(key) |
Supprimer une valeur. |
pull<T>(key) |
Lire puis supprimer une valeur. |
add(key, value, ttlSecs?) |
Écrire seulement si la clé est absente ; retourne true si la valeur a été écrite. |
Choisir le store
| Store | Portée |
|---|---|
kvStore({ appId }) |
Partagé entre les requêtes, limité à votre application, stocké dans le KV avec son TTL. |
memoryStore() |
En mémoire, propre à l'instance qui exécute le code. Adapté à un cache de courte durée et aux tests. |
Vous pouvez aussi fournir votre propre store : un objet avec get(key), set(key, value, ttlSecs?)
et delete(key), synchrones ou asynchrones. get doit renvoyer exactement la chaîne reçue par
set, ou null.
L'option prefix préfixe toutes les clés (rates:eur), ce qui évite les collisions avec vos
autres clés KV. remember ne considère que null comme absent : false, 0 et "" sont mis en
cache comme toute autre valeur. En revanche, une factory qui renvoie null est rappelée à
chaque lecture.
Mettre un loader en cache
Pour mettre en cache le résultat d'un loader de page, enveloppez-le dans cachedLoader. Le cache
est partagé par tous les workers de rendu et indexé par hôte, route, paramètres de route et chaîne
de requête. Les cookies et les en-têtes n'en font pas partie : n'enveloppez donc que des loaders
dont le résultat ne dépend pas du visiteur.
import { cachedLoader } from "@bext-stack/framework";
export const loader = cachedLoader(
{ ttl: 60, tags: ["projects"] }, // ttl in seconds, 60 when omitted
async ({ params }) => ({ project: await getProject(params!.slug) }),
);
| Option | Description |
|---|---|
ttl |
Durée de vie en secondes. Absente ou 0 : 60 secondes. |
tags |
Tags utilisés pour invalider les entrées avec revalidateTag. |
vary |
Fonction (args) => string qui ajoute des éléments à la clé, par exemple une langue. |
Seules les requêtes GET passent par le cache. Un résultat null, undefined ou une Response
n'est pas mis en cache, et le résultat est stocké en JSON.
revalidateTag("projects"), importé depuis @bext-stack/framework/cache, supprime les entrées qui
portent ce tag et retourne le nombre d'entrées supprimées.
import { revalidateTag } from "@bext-stack/framework/cache";
revalidateTag("projects");
Cache ou KV
Cache (createCache) |
KV (sdk.kv) |
|
|---|---|---|
| Usage | Valeurs recalculables | Données durables |
| Durée de vie | Courte, expire après le TTL | Conservée jusqu'à suppression (TTL optionnel) |
| Motif typique | remember(key, ttl, factory) |
get / set / delete / list |
Utilisez le cache pour mémoïser un calcul coûteux ou une réponse que vous pouvez récupérer à nouveau. Utilisez KV quand la donnée doit survivre : état lié à une session, enregistrements de job, tout ce que vous ne pouvez pas recalculer.
Et ensuite
| Page | Ce qu'elle couvre |
|---|---|
| KV Store | Le store de chaînes durable |
| Présentation du SDK | Le client createSdk |