Agent skill

Redis

by ericrisco in ericrisco/rsc-harness

A skill your agent uses when using Redis or any Redis-protocol store (Valkey, ElastiCache, Upstash, Dragonfly, Memorystore) as a cache, queue, rate limiter or distributed lock and it has to be…

MITAuto-check passedDatabases

Install Redis

skills CLI
$ npx skills add ericrisco/rsc-harness --skill redis -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ericrisco/rsc-harness redis --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/redis .claude/skills/redis && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
redis
GitHub stars
156
Token cost
~4.3k tokens
SKILL.md length
1,651 words
Files
7 (incl. scripts, references)
Skills in repo
229
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when using Redis or any Redis-protocol store (Valkey, ElastiCache, Upstash, Dragonfly, Memorystore) as a cache, queue, rate limiter or distributed lock and it has to be…

  • Works in 10 steps: Every cache key has a TTL. No TTL in a… → Never KEYS * in production — use SCAN.… → Read-modify-write must be atomic.… → …
  • Any Redis-protocol store (Valkey
  • SKILL.md covers When to use / When NOT, Non-negotiables, Decision table — which… and Caching, plus 8 more sections
  • Runs Shell scripts from its folder; calls redis-cli

What it does

Redis is an agent skill from ericrisco/rsc-harness. Use when using Redis or any Redis-protocol store (Valkey, ElastiCache, Upstash, Dragonfly, Memorystore) as a cache, queue, rate limiter or distributed lock and it has to be CORRECT rather than merely connected — stampede-proof caching, locks that cannot release someone else's hold, race-free rate limits, and jobs that survive a worker crash. NOT durable SQL queues with SELECT FOR UPDATE SKIP LOCKED (that is postgresdb), NOT vector similarity search over embeddings (that is vector-db).

Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/caching.md`).

It sits in Databases, covering Caching, Rate limiting and Vector databases. It works with Redis, SQL and Upstash. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.

When your agent uses it

  • Any Redis-protocol store (Valkey
  • Memorystore) as a cache
  • Distributed lock and it has to be CORRECT rather than merely connected — stampede-proof caching
  • Locks that cannot release someone elses hold

Example prompts

  • “/redis”

Requirements

  • Node.js
  • A Bash shell

Workflow steps

10 steps, taken from the first numbered list in SKILL.md.

  1. Every cache key has a TTL. No TTL in a cache = a memory leak that eventually evicts or 500s.
  2. Never KEYS * in production — use SCAN. KEYS is O(N) and blocks the single thread;
  3. Read-modify-write must be atomic. App-side GET then SET/INCR races under concurrency.
  4. A lock = random token + PX + Lua compare-and-delete. Plain DEL releases whoever holds it
  5. Pick maxmemory-policy deliberately. The default noeviction makes a full cache fail every
  6. A queue must ack and recover. RPOP straight into a worker loses the job if the worker dies
  7. Cap unbounded structures. Lists grow forever without LTRIM; streams without MAXLEN ~.
  8. One Lua = one short atomic step. Redis is single-threaded; a long script or huge MULTI/EXEC
  9. Namespace keys as svc:entity:id (e.g. cart:user:42) so scans, eviction, and humans can reason.
  10. Know cache vs database durability before choosing persistence. Cache = lose-it-and-rebuild;

What it can do on your machine

Read from SKILL.md and the folder at commit 92fde8f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • redis-cli

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Redis loads about 4.3k tokens when it runs, and up to ~8.4k if it reads all its reference files. Until then it costs about 125 tokens; SKILL.md has 1,651 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~125
When it runs · the whole SKILL.md, loaded when a task matches
~4.3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~8.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 1,651 words, ~4,321 tokens.

Download SKILL.mdSave it as .claude/skills/redis/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
name
redis
description
Use when using Redis or any Redis-protocol store (Valkey, ElastiCache, Upstash, Dragonfly, Memorystore) as a cache, queue, rate limiter or distributed lock and it has to be CORRECT rather than merely connected — stampede-proof caching, locks that cannot release someone else's hold, race-free rate limits, and jobs that survive a worker crash. NOT durable SQL queues with SELECT FOR UPDATE SKIP LOCKED (that is `postgresdb`), NOT vector similarity search over embeddings (that is `vector-db`).
tags
redis, valkey, cache, rate-limiting, distributed-locks, queues, bullmq, streams, lua, data-infra
recommends
postgresdb, vector-db, clickhouse-analytics, scaling, nodejs, fly-io
origin
risco

Redis — cache, lock, rate limiter, queue done correctly

Redis is four primitives wearing one server: a cache, a distributed lock, a rate limiter, and a job queue. Each has a correctness contract that has nothing to do with whether SET returns OK. You almost certainly already "have Redis working" — a value goes in, a value comes out. What you do not yet have is a cache that won't stampede your database, a lock that won't release someone else's hold, a rate limiter that survives concurrent requests, and a queue whose jobs aren't silently lost when a worker dies. This skill is engine- and pattern-level, client-SDK-agnostic: examples are redis-cli and Lua, so they hold across node-redis, ioredis, redis-py, go-redis, and Lettuce. Every pattern applies unchanged to Valkey and any Redis-protocol store, since Valkey is a BSD fork of Redis 7.2 and stays protocol-compatible.

When to use / When NOT

Use when you are:

  • Adding or reviewing a cache: TTL strategy, cache-aside vs write-through, key naming, stampede/thundering-herd prevention, negative caching, invalidation.
  • Building a distributed lock: "only one worker does X", cron de-duplication, leader-ish mutual exclusion — the SET NX PX + Lua-release + fencing-token contract, and the Redlock call.
  • Building a rate limiter: per-user/IP/API-key throttling (fixed window, sliding-window log, sliding-window counter, token bucket) and why naive INCR+EXPIRE is a race.
  • Running a queue / background jobs on Redis: Lists vs Streams vs a library (BullMQ, Sidekiq, RQ, Celery), at-least-once delivery, acks, stalled-job recovery, idempotency.
  • Deciding eviction & persistence: maxmemory-policy, RDB vs AOF, cache mode vs database mode.
  • Reviewing Redis code for foot-guns: KEYS *, unbounded keys, non-atomic read-modify-write, missing TTL, a lock released by the wrong owner.

NOT for (route instead):

  • Durable SQL queue (SELECT … FOR UPDATE SKIP LOCKED), engine-level SQL caching → ../postgresdb/SKILL.md. Boundary: if the durable store is the queue, that's postgresdb; if Redis is the queue, you're here.
  • Vector similarity / semantic search as the primary job → ../vector-db/SKILL.md. Redis 8 vector sets are only noted here.
  • Analytical / clickstream event store → ../clickhouse-analytics/SKILL.md.
  • System-level capacity / load strategy, and app/CDN/HTTP-layer caching (Cache-Control, ISR, edge) → ../scaling/SKILL.md. This skill owns the Redis-specific data contract underneath.
  • Provisioning a managed Redis (cluster sizing, dashboards) → ../fly-io/SKILL.md / ../aws-essentials/SKILL.md. This skill gives the client-side contract, not console clicks.
  • Language-runtime async/job concepts unrelated to Redis → ../nodejs/SKILL.md or your language skill.

Non-negotiables

  1. Every cache key has a TTL. No TTL in a cache = a memory leak that eventually evicts or 500s.
  2. Never KEYS * in production — use SCAN. KEYS is O(N) and blocks the single thread; one bad pattern freezes every client.
  3. Read-modify-write must be atomic. App-side GET then SET/INCR races under concurrency. Use one Lua EVAL, a single atomic command, or WATCH/MULTI.
  4. A lock = random token + PX + Lua compare-and-delete. Plain DEL releases whoever holds it now (maybe not you); a lock with no PX is held forever if the owner crashes.
  5. Pick maxmemory-policy deliberately. The default noeviction makes a full cache fail every write — correct for a database, fatal for a cache.
  6. A queue must ack and recover. RPOP straight into a worker loses the job if the worker dies mid-task; use a processing list or Streams consumer groups.
  7. Cap unbounded structures. Lists grow forever without LTRIM; streams without MAXLEN ~.
  8. One Lua = one short atomic step. Redis is single-threaded; a long script or huge MULTI/EXEC blocks all clients, not just yours.
  9. Namespace keys as svc:entity:id (e.g. cart:user:42) so scans, eviction, and humans can reason.
  10. Know cache vs database durability before choosing persistence. Cache = lose-it-and-rebuild; database = RDB/AOF and noeviction. Decide which Redis is before you tune it.

Decision table — which primitive, which structure

NeedStructureCanonical commandsThe one gotcha
Cachestring / hash + TTLSET k v EX 300 / GETEX / HSET+EXPIREstampede on expiry
Lockstring + random tokenSET k tok NX PX 30000 + Lua compare-and-DELwrong-owner release
Rate limitstring / zset / hashone atomic EVAL (window/log/bucket)lost EXPIRE → immortal counter
Queue (simple)listLMOVE src proc LEFT RIGHT / BRPOPLPUSHjob loss on crash without a processing copy
Queue (reliable)streamXADD / XREADGROUP / XACK / XAUTOCLAIMunacked PEL grows unbounded

Caching

Namespace + TTL with jitter. A fixed TTL on a batch of keys written together synchronizes their expiry — they all die in the same second and stampede the origin at once. Add jitter.

bash
# Bad: 1000 keys warmed in a loop with the same TTL all expire together
SET product:42 "$json" EX 300
# Good: spread expiry with per-key jitter (300s ± up to 60s)
SET product:42 "$json" EX $(( 300 + RANDOM % 60 ))

Cache-aside (read path). Why: it is the default for read-heavy data; the trap is forgetting the TTL and forgetting to cache the miss.

text
# Bad: cache only hits, never the miss → every request for an absent id hits the DB
val = GET product:42
if val == nil: val = db.fetch(42); SET product:42 val EX 300   # absent rows still hammer the DB

# Good: cache-aside with negative caching
val = GET product:42
if val == "__MISS__": return null                              # cached miss, no DB call
if val == nil:
    val = db.fetch(42)
    if val == null: SET product:42 "__MISS__" EX 30            # short negative TTL
    else:           SET product:42 val EX 300

Stampede prevention. When a hot key expires, N concurrent requests all miss and hammer the origin. Two mitigations:

  • Recompute lock — one request rebuilds, the rest briefly serve stale or wait. The lock TTL must exceed worst-case origin latency, or two requests rebuild anyway.

    bash
    # On miss, try to claim the rebuild; only the winner recomputes
    SET product:42:lock 1 NX PX 5000   # 5s > slowest DB rebuild
    # winner: rebuild, SET product:42, then DEL product:42:lock
    # losers: serve last-known value or retry after a short sleep
  • Probabilistic early expiration (XFetch) — refresh before TTL with rising probability so one request renews early while others still hit a warm key. Math + write-through/read-through/ write-behind in references/caching.md.

Invalidation: on write, either delete the key (next read rebuilds) or write-through. Never rely on manual invalidation instead of a TTL — you will miss a path and serve stale forever.

Distributed locks

bash
# Bad: GET-then-DEL races — between your GET and DEL the lock can expire and a NEW owner takes it,
#      and your DEL frees THEIR lock.
GET resource:lock        # == my token?
DEL resource:lock        # ← may delete someone else's lock

# Good: claim with a random token + PX, release only if the token is still mine (atomic Lua).
SET resource:lock "$TOKEN" NX PX 30000     # NX = only if absent; PX = auto-expire so a crash frees it

Release must be a compare-and-delete in one Lua step:

lua
-- KEYS[1] = lock key, ARGV[1] = my token. Returns 1 if I held and released it, else 0.
if redis.call('GET', KEYS[1]) == ARGV[1] then
  return redis.call('DEL', KEYS[1])
else
  return 0
end

TTL vs work duration. If the protected work can outlast PX, the lock expires mid-task and a second worker starts. Either size PX above the worst case, or run a watchdog that renews the TTL (again via a token-checked Lua PEXPIRE) while work continues — never blindly PEXPIRE.

Fencing tokens. A GC pause or a long syscall can freeze the lock holder past expiry; another worker acquires, then the paused one wakes and writes — both think they hold the lock. The only fix is a fencing token: a monotonically increasing number issued with the lock and checked by the protected resource, which rejects any write carrying a stale token. No Redis lock alone provides this.

Redlock decision. Single-instance SET NX PX is fine when occasional double-execution is tolerable (idempotent work, best-effort cron de-dup). For hard mutual exclusion, a single Redis lock is not enough and multi-instance Redlock is contested (it assumes bounded clock drift and no long pauses) — fence the resource or use a lease/consensus system. Full Redlock walk-through and critique in references/locks-and-rate-limiting.md.

Show full SKILL.md (644 more words)Show less

Rate limiting

text
# Bad: GET/INCR then EXPIRE as two steps. If the process dies (or loses the race) between INCR and
#      EXPIRE, the key has NO TTL and counts forever — the user is throttled permanently.
n = INCR rl:user:42
if n == 1: EXPIRE rl:user:42 60     # ← may never run

Fixed window, done atomically in one EVAL:

lua
-- KEYS[1] = counter, ARGV[1] = limit, ARGV[2] = window seconds. Returns 1 = allow, 0 = deny.
local n = redis.call('INCR', KEYS[1])
if n == 1 then redis.call('EXPIRE', KEYS[1], ARGV[2]) end   -- TTL set atomically with the first hit
if n > tonumber(ARGV[1]) then return 0 end
return 1

Fixed window allows up to 2× the limit across a boundary. For smoother limits:

  • Sliding-window log — a sorted set scored by timestamp, pruned and counted in one Lua: ZREMRANGEBYSCORE (drop entries older than the window) → ZCARD (count) → ZADD (record now) → EXPIRE. Exact, but O(requests) memory per key.
  • Token bucket — a hash holding {tokens, last_refill}; refill by elapsed time and decrement, all in one Lua. Allows bursts up to bucket size, then a steady rate. Smallest memory.

Choose by accuracy-vs-memory; full Lua for all four in references/locks-and-rate-limiting.md.

Queues

OptionWhenAcks / recovery
Listsimplest at-least-once, low volumemanual: processing list + requeue stalled
Streamreliable jobs, consumer groups, native acksXACK + XAUTOCLAIM for stalled/pending
Library (BullMQ/Sidekiq/RQ/Celery)you want retries, scheduling, a dashboardbuilt-in; don't hand-roll

Reliable list: never RPOP straight into the worker — a crash mid-task loses the job. Move it to a per-worker processing list atomically, then ack by removing it.

bash
job=$(redis-cli LMOVE jobs jobs:proc:w1 LEFT RIGHT)   # atomic: pop from jobs, push to processing
# ... do work (idempotently) ...
redis-cli LREM jobs:proc:w1 1 "$job"                  # ack: remove from processing
# a reaper requeues anything left in jobs:proc:* after a worker dies

Streams (preferred for reliable jobs): consumer groups give per-message acks and a Pending Entries List for recovery.

bash
redis-cli XGROUP CREATE jobs g1 '$' MKSTREAM
redis-cli XREADGROUP GROUP g1 worker1 COUNT 10 BLOCK 5000 STREAMS jobs '>'
# ... process ...
redis-cli XACK jobs g1 "$id"                          # ack a done message
redis-cli XAUTOCLAIM jobs g1 worker2 60000 0          # reclaim messages idle > 60s (stalled worker)

Delivery is at-least-once: a message can be reprocessed after a crash, so make handlers idempotent (dedupe on a job id / idempotency key). Reach for BullMQ (TypeScript; stalled-job lock renewal via lockDuration/lockRenewTime), Sidekiq (Ruby), or RQ/Celery (Python) when you want retries, delays, and a dashboard — don't reinvent them. Full implementations, DLQ, and the library comparison in references/queues.md.

Eviction & persistence

maxmemory-policyBehaviorUse for
noeviction (default)writes fail when fullRedis-as-database (durable data you can't drop)
allkeys-lru / allkeys-lfuevict any key by recency / frequencya pure cache (every key is disposable)
volatile-lru / volatile-ttl / volatile-lfuevict only keys that have a TTLmixed: durable keys without TTL stay

A "cache" running noeviction with no TTLs is a memory leak that starts 500ing writes when full — the single most common Redis incident. Set maxmemory and an allkeys-* policy for a cache.

Persistence: RDB = periodic point-in-time snapshots (fast restart, can lose the last interval); AOF = append every write (durable, slower, larger). A pure cache often needs neither — losing it just rebuilds from the origin. Decide cache-mode vs database-mode first, then persistence follows.

Anti-patterns → STOP

RationalizationWhat actually happensDo instead
"INCR then EXPIRE is fine"a lost EXPIRE leaves a TTL-less counter → immortal throttleone atomic EVAL (set TTL when n == 1)
"I'll GET then DEL the lock"races; frees a different owner's lockrandom token + Lua compare-and-delete
"KEYS user:* to find my keys"O(N), blocks the single thread, freezes all clientsSCAN MATCH user:* COUNT 100
"No TTL, I'll invalidate manually"you miss a path → stale forever + unbounded memoryTTL on every cache key, always
"Redlock means the lock is safe"a GC pause double-acquires; clock-drift assumptionsfence the resource, or accept double-run on idempotent work
"RPOP the job into the worker"worker dies mid-task → job vanishesLMOVE to a processing list, or Streams + XACK
"Big MULTI / long Lua = throughput"single thread blocks every client for the durationkeep each atomic step short; chunk the work
"Fixed-window limiter is exact"allows ~2× the limit across the window boundarysliding-window log or token bucket if exactness matters

Quick reference

bash
# Cache:      SET k v EX 300 | GETEX k EX 300 | DEL k | SCAN 0 MATCH 'product:*' COUNT 100
# Lock:       SET k tok NX PX 30000  (release via the Lua compare-and-delete above)
# Rate limit: EVAL "<lua>" 1 rl:user:42 100 60   (limit 100 / 60s)
# Queue:      LMOVE jobs jobs:proc LEFT RIGHT | LREM jobs:proc 1 "$job"
#             XADD jobs '*' field v | XREADGROUP ... | XACK | XAUTOCLAIM

# Diagnostics (read-only):
redis-cli INFO memory          # used_memory, maxmemory, evicted_keys
redis-cli --bigkeys            # find the keys eating your memory
redis-cli SLOWLOG GET 10       # slowest recent commands
redis-cli OBJECT FREQ mykey    # access frequency (needs allkeys-lfu)
redis-cli MEMORY USAGE mykey   # bytes for one key
redis-cli SCAN 0 MATCH 'sess:*' COUNT 100   # never KEYS in prod

scripts/verify.sh scans your project for the high-confidence foot-guns (KEYS * in source, lock release without a token compare, INCR with no EXPIRE, maxmemory with no policy). It is read-only, never connects to a server, and exits 0 when no Redis usage is found.

Project grounding

Record this project's Redis decisions in 02-DOCS/wiki/stack/redis.md (recorded, not gated — same convention postgresdb uses): which primitive(s) you run, the maxmemory-policy, persistence (RDB/AOF/none), the client library, and any lock/rate-limit Lua you depend on. Future agents read this before touching the cache.

See Also

© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files (scripts, references) in skills/redis of ericrisco/rsc-harness.

  • SKILL.md
  • evals/README.md
  • evals/cases.yaml
  • references/caching.md
  • references/locks-and-rate-limiting.md
  • references/queues.md
  • scripts/verify.sh

Open the folder on GitHubat commit 92fde8f

Compare with similar skills

Redis next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Redis compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Redis this skillericrisco/rsc-harness156—~4.3kAutomated safety check: PassMIT
DBoracle/skills872—~1.4kAutomated safety check: PassUPL-1.0
Upstash Redisgithub/awesome-copilot40k—~1.7kAutomated safety check: PassMIT
Crudwujun728/jun_java_plugin240—~2.8kAutomated safety check: PassNone
Upstash Redis Kvintellectronica/agent-skills295—~2.8kAutomated safety check: WarnCC0-1.0
AWS Storageaws/agent-toolkit-for-aws2.8k—~5.8kAutomated safety check: PassApache-2.0

Similar skills

  • DB

    oracle/skills

    Official

    Oracle Database guidance for SQL, PL/SQL, SQLcl, ORDS, Oracle Vector SDK, administration, app development, performance, security, migrations, and agent-safe database workflows.

    872 GitHub stars~1.4k tokensUpdated yesterday
    DatabasesAuto-check passed
  • Upstash Redis

    github/awesome-copilot

    Official

    Use Redis over HTTP from serverless and edge runtimes with @upstash/redis, and add rate limiting with @upstash/ratelimit.

    40k GitHub stars~1.7k tokensUpdated today
    Backend & APIsAuto-check passed
  • Crud

    wujun728/jun_java_plugin

    一键生成完整业务模块代码(SQL/Entity/DAO/XML/Repository/Service/Controller/Mapper/POJO),用于创建新的业务功能

    240 GitHub stars~2.8k tokensUpdated 4 mo ago
    DatabasesAuto-check passed
  • Upstash Redis Kv

    intellectronica/agent-skills

    Read and write to Upstash Redis-compatible key-value store via REST API.

    295 GitHub stars~2.8k tokensUpdated 5 mo ago
    DatabasesAuto-check: warnings
  • AWS Storage

    aws/agent-toolkit-for-aws

    Official

    Selects, investigates, and compares AWS object, file, and block storage services, and answers cost, performance, configuration, security, and troubleshooting questions about storage services.

    2.8k GitHub stars~5.8k tokensUpdated today
    DatabasesAuto-check passed
  • Bun Redis

    secondsky/claude-skills

    A skill your agent uses when working with Redis in Bun (ioredis, Upstash), caching, pub/sub, session storage, or key-value operations.

    227 GitHub stars~1.8k tokensUpdated 9 days ago
    DatabasesAuto-check passed

More from ericrisco/rsc-harness

All 229 skills in this repo
  • Ab Testing

    ericrisco/rsc-harness

    A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…

    156 GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • Accessibility

    ericrisco/rsc-harness

    A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…

    156 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Ads

    ericrisco/rsc-harness

    A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…

    156 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Agent Eval

    ericrisco/rsc-harness

    A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…

    156 GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • AI Media

    ericrisco/rsc-harness

    A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…

    156 GitHub stars~3.3k tokensUpdated today
    Auto-check passed
  • Analytics

    ericrisco/rsc-harness

    A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.

    156 GitHub stars~2.8k tokensUpdated today
    Auto-check passed

Works with

Questions about Redis

What does Redis do?

A skill your agent uses when using Redis or any Redis-protocol store (Valkey, ElastiCache, Upstash, Dragonfly, Memorystore) as a cache, queue, rate limiter or distributed lock and it has to be…. Redis is an agent skill from ericrisco/rsc-harness. Use when using Redis or any Redis-protocol store (Valkey, ElastiCache, Upstash, Dragonfly, Memorystore) as a cache, queue, rate limiter or distributed lock and it has to be CORRECT rather than merely connected — stampede-proof caching, locks that cannot release someone else's hold, race-free rate limits, and jobs that survive a worker crash.

When should I use Redis?

Redis fits situations like: any Redis-protocol store (Valkey; memorystore) as a cache; distributed lock and it has to be CORRECT rather than merely connected — stampede-proof caching; locks that cannot release someone elses hold.

How do I install Redis in Claude Code?

Run `npx skills add ericrisco/rsc-harness --skill redis -a claude-code`. Or copy the skill folder (skills/redis in ericrisco/rsc-harness) into .claude/skills/redis in your project. Claude Code loads it when a task matches its description.

How do I install Redis in Codex?

Run `npx skills add ericrisco/rsc-harness --skill redis -a codex`. Or copy the skill folder (skills/redis in ericrisco/rsc-harness) into .agents/skills/redis in your project. Codex loads it when a task matches its description.

Can I use Redis in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill redis -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/redis, .gemini/skills/redis, .github/skills/redis and .opencode/skills/redis in your project.

What does Redis need to run?

Going by SKILL.md and its folder, Redis needs a shell for the scripts in its folder and the command-line tools its instructions call (redis-cli). Our summary lists: Node.js; A Bash shell.

Does Redis access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Redis safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Redis use?

Redis is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Redis use?

About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.1k tokens, read only when the agent opens those files.

What are the alternatives to Redis?

Skills that share tags, products or a category with Redis: DB (oracle/skills, 872 stars), Upstash Redis (github/awesome-copilot, 40k stars), Crud (wujun728/jun_java_plugin, 240 stars) and Upstash Redis Kv (intellectronica/agent-skills, 295 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Redis?

ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 2026.

Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.