К основному содержанию
скилл CX Codex

caching · zebbern — скилл для Claude Code: кэширование и установка

Скилл помогает проектировать и проверять кэширование: выбирать TTL, задавать ключи и продумывать инвалидацию. Пригодится при работе с кэшем API, сервиса или клиентского приложения.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add zebbern/claude-code-guide --skill caching -a claude-code
Открыть на GitHub

Что делает caching

Скилл помогает выбрать слой кэша — от памяти и Redis до CDN и HTTP-заголовков — и связать TTL с тем, как часто меняются данные. Он подсказывает, как составлять ключи с параметрами запросов и разделять их по сервисам, чтобы не отдавать устаревшие или чужие данные.

Для каждого кэша нужно определить инвалидацию: полагаться только на истечение TTL недостаточно. Скилл также разбирает stale-while-revalidate, кэширование ошибок и защиту от одновременного обновления популярного ключа. Чувствительные пользовательские данные нельзя помещать в общий кэш.

Внутри есть примеры для Map с TTL, Redis через ioredis, HTTP-заголовков в Express/Hono и TanStack Query. Для Redis-примера нужна библиотека ioredis; это стоит учесть, если вы переносите пример в проект.

Какие задачи решает

  • выбрать TTL с учётом частоты изменений данных
  • составить ключ кэша со всеми параметрами запроса
  • задать инвалидацию при изменении исходных данных
  • найти причины устаревших ответов и cache stampede
  • настроить staleTime и gcTime в TanStack Query

Примеры запросов агенту

  • Проверь кэширование в этом API и найди ключи, в которых пропущены параметры запроса.
  • Предложи стратегию инвалидации для кэша профилей пользователей.
  • Настрой staleTime и gcTime для запросов TanStack Query с учётом частоты обновления данных.

Как установить caching

1Через Skills CLI (Vercel)

npx skills add zebbern/claude-code-guide --skill caching -a claude-code

2Вручную: положить файлы

~/.claude/skills/caching/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/caching/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о caching

Как установить caching в Claude Code?

Выполните npx skills add zebbern/claude-code-guide --skill caching -a claude-code. Файл скилла находится по пути ~/.claude/skills/caching/SKILL.md.

Что делает скилл caching?

Он помогает проектировать кэши и проверять их настройки: TTL, ключи, инвалидацию и выбор слоя. Также описывает случаи, когда кэшировать данные опасно.

Можно ли использовать caching с TanStack Query?

Да. Скилл разбирает настройку staleTime и gcTime, а также ключи запросов с параметрами, влияющими на результат.

Исходный текст

SKILL.md · MIT
---
name: caching
description: Caching strategies — invalidation, TTL guidelines, cache keys, cache layers, and when not to cache. Use when implementing or reviewing caching logic.
---
## WHEN_TO_USE

- When implementing a cache layer (in-memory, Redis, CDN) for an API or service.
- When choosing TTL values or invalidation strategies for cached data.
- When designing cache key schemas to avoid collisions or stale-data bugs.
- When reviewing code that reads from or writes to any cache.
- When debugging stale data, cache stampedes, or inconsistent responses.
- When configuring TanStack Query `staleTime`/`gcTime` for client-side caching.

## INVALIDATION

- [P0-MUST] Define an invalidation strategy for every cache. Stale data is worse than no cache.
- [P0-MUST] Invalidate caches when the underlying data changes — do not rely solely on TTL expiry.
- [P1-SHOULD] Prefer event-driven invalidation (on write/update/delete) over time-based expiry alone.
- [P1-SHOULD] Use cache versioning (include a version key) when data schemas change.

## TTL_GUIDELINES

- [P1-SHOULD] Set TTLs based on data volatility: static config (hours/days), user profiles (minutes), real-time data (seconds or no cache).
- [P1-SHOULD] Use stale-while-revalidate: serve stale data immediately while refreshing in the background.
- [P2-MAY] Use shorter TTLs in development and longer TTLs in production.

## CACHE_KEYS

- [P0-MUST] Include all query parameters that affect the result in the cache key.
- [P1-SHOULD] Use a consistent key format: `<entity>:<id>:<variant>` (e.g., `user:123:profile`, `products:list:page=2`).
- [P1-SHOULD] Namespace keys by service or module to prevent collisions.
- [P2-MAY] Hash long or complex keys to keep storage efficient.

## CACHE_LAYERS

- [P1-SHOULD] Use the appropriate cache layer for the use case:

| Layer | Best For | TTL Range |
|-------|----------|-----------|
| In-memory (Map, LRU) | Hot data, single-instance apps | Seconds to minutes |
| Redis / Memcached | Shared cache across instances, sessions | Minutes to hours |
| CDN / Edge | Static assets, public API responses | Hours to days |
| HTTP cache headers | Browser caching, API responses | Varies by resource |

- [P1-SHOULD] Layer caches: check memory → Redis → origin. Write-through on miss.

## WHEN_NOT_TO_CACHE

- [P0-MUST] Do not cache user-specific sensitive data (auth tokens, payment info) in shared caches.
- [P1-SHOULD] Do not cache rapidly changing data where staleness causes incorrect behavior (inventory counts, real-time pricing).
- [P1-SHOULD] Do not cache error responses — use short TTL or skip caching on failure.
- [P2-MAY] Avoid caching when the computation is cheap and the data set is small.

## CODE_EXAMPLES

### In-memory LRU cache with TTL

```ts
const cache = new Map<string, { value: unknown; expires: number }>();
const MAX_SIZE = 500;

export function getOrSet<T>(key: string, ttlMs: number, compute: () => T): T {
  const entry = cache.get(key);
  if (entry && entry.expires > Date.now()) return entry.value as T;

  const value = compute();
  if (cache.size >= MAX_SIZE) {
    // Evict oldest entry (first inserted)
    const oldest = cache.keys().next().value!;
    cache.delete(oldest);
  }
  cache.set(key, { value, expires: Date.now() + ttlMs });
  return value;
}
```

### Redis stale-while-revalidate with ioredis

```ts
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL);

export async function swr<T>(
  key: string,
  freshSec: number,
  staleSec: number,
  fetcher: () => Promise<T>,
): Promise<T> {
  const raw = await redis.get(key);
  if (raw) {
    const { value, createdAt } = JSON.parse(raw) as { value: T; createdAt: number };
    const ageMs = Date.now() - createdAt;
    if (ageMs < freshSec * 1000) return value; // Fresh — return immediately
    if (ageMs < staleSec * 1000) {
      // Stale — return cached, refresh in background
      fetcher().then((v) =>
        redis.set(key, JSON.stringify({ value: v, createdAt: Date.now() }), "EX", staleSec),
      );
      return value;
    }
  }
  const value = await fetcher();
  await redis.set(key, JSON.stringify({ value, createdAt: Date.now() }), "EX", staleSec);
  return value;
}
```

### HTTP cache headers in Express/Hono

```ts
// Immutable assets (hashed filenames)
app.use("/assets", (_, res, next) => {
  res.setHeader("Cache-Control", "public, max-age=31536000, immutable");
  next();
});

// API responses — short cache with revalidation
app.get("/api/products", (_, res) => {
  res.setHeader("Cache-Control", "public, max-age=60, stale-while-revalidate=300");
  res.json(products);
});
```

### TanStack Query cache configuration

```tsx
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: 5 * 60 * 1000, // Data fresh for 5 minutes
      gcTime: 30 * 60 * 1000,   // Garbage-collect after 30 minutes
      retry: 2,
      refetchOnWindowFocus: false,
    },
  },
});

// Usage in a component
const { data } = useQuery({
  queryKey: ["products", { page, category }], // Cache key includes params
  queryFn: () => fetchProducts({ page, category }),
});
```

## ANTI_PATTERNS

- **Cache-and-forget** — Caching data with no invalidation strategy. Data goes stale permanently.
  - Instead: define explicit invalidation (event-driven on write, or bounded TTL) for every cache key.

- **Uniform TTL** — Using the same TTL (e.g., 1 hour) for all data regardless of volatility.
  - Instead: match TTL to data change frequency — seconds for prices, minutes for profiles, hours for configs.

- **Missing key parameters** — Cache key omits user ID, locale, or query params, serving wrong data.
  - Instead: include every parameter that affects the result: `products:list:page=2:locale=en`.

- **Caching errors** — Storing error responses (500s, timeouts) with long TTLs.
  - Instead: skip caching on failure, or use a very short TTL (5-10 seconds) to allow fast retry.

- **Cache stampede** — All instances hit the origin simultaneously when a popular key expires.
  - Instead: use stale-while-revalidate, jittered TTLs, or a mutex lock to let one instance refresh.

© zebbern · MIT · zebbern/claude-code-guide

Похожие скиллы

Все скиллы по теме «Бэкенд и API» →

Сначала — caching от других авторов.

caching codewithmukesh Настраивает кеширование в приложениях .NET 10: HybridCache, кеш ответов и распределённый кеш. Нужен при снижении нагрузки на базу данных и настройке инвалидации. CX Codex +1 2 800установок mcp-builder официальный anthropics Скилл проводит через создание MCP-сервера на TypeScript или Python: от изучения протокола до тестов и оценки качества. 130 949установок claude-api официальный anthropics Справочник по Anthropic SDK и API Claude для генерации кода без устаревших параметров и выдуманных методов. 74 198установок lark-im larksuite Скилл подключает Lark IM к агенту: он отправляет сообщения, ищет историю, управляет чатами и файлами. Подойдёт для задач вокруг командных коммуникаций. CX Codex +1 472 900установок lark-event larksuite Слушает события Lark/Feishu и отдаёт их потоком NDJSON. Подходит для ботов, обработчиков сообщений и долгих подписчиков. CX Codex +1 466 800установок caveman-discover JuliusBrussee Находит точки вызова LLM в репозитории и размечает их воркфлоу для Caveman Cloud, чтобы расходы на токены не сливались в одну общую кучу. CX Codex +1 104 400установок migration JuliusBrussee Скилл задаёт правила безопасных миграций схем, данных и API с обязательным откатом. Пригодится при изменениях, где нельзя терять данные или ломать совместимость. CX Codex +1 103 900установок

Из того же набора24

database-scout Скилл для чтения схем SQLite и PostgreSQL: показывает таблицы, колонки, связи и рисует Mermaid ER-диаграммы. Запросы только на чтение. CX Codex +1 ★ 4 679звёзд репо data-viz-renderer Скилл превращает JSON-данные в автономную HTML/SVG-инфографику: карточки показателей, сравнения, схемы процессов и дашборды. Пригодится для отчётов и продуктовых метрик. CX Codex +1 ★ 4 679звёзд репо cv-tailor Скилл разбирает резюме и текст вакансии, считает совпадение ключевых слов и переписывает опыт по STAR с цифрами. CX Codex +1 ★ 4 679звёзд репо code-documenter Скилл для написания докстрингов, спецификаций OpenAPI и сайтов документации. Пригодится, когда код есть, а описаний к нему нет. CX Codex +1 ★ 4 679звёзд репо aws-penetration-testing Скилл ведёт агента по пентесту AWS: перечисление IAM, повышение привилегий, SSRF к metadata, разбор S3 и Lambda. CX Codex +1 ★ 4 679звёзд репо audit-flow Скилл помогает интерактивно проследить путь данных через CODE, API, AUTH, DATA и NETWORK, сохранить ход аудита в SQLite и экспортировать результат. Пригодится для разбора безопасности, отладки и анализа архитектуры. CX Codex +1 ★ 4 679звёзд репо api-shape-explorer Скилл запускает несколько субагентов сразу, чтобы получить радикально разные варианты интерфейса модуля и сравнить их до написания кода. CX Codex +1 ★ 4 679звёзд репо academic-paper-reviewer Скилл имитирует рецензирование научной статьи: оценивает новизну, методологию, результаты и текст. Пригодится, чтобы получить замечания и рекомендации по доработке. CX Codex +1 ★ 4 679звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой