redis-connections — Claude Code skill: a Redis client that stops
A skill that tells your coding agent how to configure a Redis client properly: connection pooling, pipelining, socket timeouts and client-side caching.
npx skills add redis/agent-skills --skill redis-connections -a claude-codeWhat redis-connections does
The skill covers five areas: pooling or multiplexing instead of opening a TCP connection per call, pipelining batches of commands, swapping KEYS, SMEMBERS and HGETALL for the incremental SCAN, SSCAN and HSCAN, client-side caching over RESP3, and explicit socket timeouts. Inside are redis-py examples, a table comparing pool and multiplex styles, and reference notes under references/.
It fires when the agent writes or reviews Redis client code — redis-py, Jedis, Lettuce, go-redis, NRedisStack. One thing it flags: a multiplexed connection in Lettuce and NRedisStack cannot carry blocking commands like BLPOP, so queue consumers need a pool instead.
Turn on client-side caching only for data that is read often and written rarely — config, feature flags, per-request sessions. On a write-heavy workload the invalidation traffic cancels the savings. For timeouts the skill suggests keeping the connect value below the read value and enabling retry_on_timeout.
What it helps with
- stop opening a fresh connection on every Redis call
- batch independent commands into one pipeline
- rewrite key iteration from
KEYSto aSCANcursor loop - enable client-side caching for hot keys
- pick connect and read timeouts that match the app's failure model
Example prompts for the agent
- Set up a connection pool for redis-py in this service
- Replace
KEYS user:*with aSCANloop - Enable client-side caching for config keys over RESP3
How to install redis-connections
1Skills CLI (Vercel)
npx skills add redis/agent-skills --skill redis-connections -a claude-code2Manually: put the files in place
~/.claude/skills/redis-connections/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/redis-connections/
1Skills CLI (Vercel)
npx skills add redis/agent-skills --skill redis-connections -a codex2Manually: put the files in place
.agents/skills/redis-connections/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add redis/agent-skills --skill redis-connections -a cursor2Manually: put the files in place
.cursor/skills/redis-connections/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install redis/agent-skills redis-connections2Manually: put the files in place
.github/skills/redis-connections/SKILL.md1Skills CLI (Vercel)
npx skills add redis/agent-skills --skill redis-connections -a gemini-cli2Platform CLI
gemini skills install https://github.com/redis/agent-skills --path skills/redis-connectionsManually: put the files in place
.devin/skills/redis-connections/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add redis/agent-skills --skill redis-connections -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about redis-connections
How do I install redis-connections in Claude?
Run npx skills add redis/agent-skills --skill redis-connections -a claude-code. The skill lands in ~/.claude/skills/redis-connections/SKILL.md.
What does redis-connections do?
It gives the agent rules for Redis client code: pool or multiplex, pipeline bulk work, iterate with incremental commands instead of blocking ones, cache on the client, and set socket timeouts.
Why can't blocking commands run on a multiplexed connection?
Lettuce and NRedisStack share one connection across all requests, and BLPOP, BRPOP and BLMOVE wait for data while holding it. The skill points queue consumers to a pool with an explicit timeout.
Source text
SKILL.md · MIT
---
name: redis-connections
description: Redis client and connection guidance covering connection pooling, multiplexing, pipelining, client-side caching with RESP3, avoiding slow commands (KEYS, SMEMBERS, HGETALL), and tuning socket timeouts. Use when configuring a Redis client (redis-py, Jedis, Lettuce, NRedisStack), batching commands for throughput, eliminating per-request connection creation, iterating large keyspaces with SCAN, enabling client-side caching for read-heavy workloads, or setting connect and read timeouts.
license: MIT
metadata:
author: Redis, Inc.
version: "0.1.0"
---
# Redis Connections
Client-side guidance for talking to Redis efficiently: how to share connections, how to batch commands, which commands not to call in production, when to turn on client-side caching, and how to set timeouts that fail fast without breaking healthy traffic.
## When to apply
- Creating or reviewing a Redis client setup (redis-py, Jedis, Lettuce, go-redis, NRedisStack).
- Making many small Redis calls and wondering where the latency is going.
- Iterating large keyspaces, sets, hashes, or lists.
- Enabling client-side caching for hot keys.
- Tuning connect / read / write timeouts.
## 1. Pool or multiplex — never one connection per request
The single biggest mistake in Redis client code is opening a new TCP connection for every operation. Always either:
- **Pool** — keep N persistent connections that the application leases per call (redis-py `ConnectionPool`, Jedis `JedisPooled`, go-redis client).
- **Multiplex** — share a single connection across all requests (Lettuce, NRedisStack).
| Style | Used by | Note |
|---|---|---|
| Pool | redis-py, Jedis, go-redis | Each lease blocks if pool exhausted; size the pool to your concurrency |
| Multiplex | Lettuce, NRedisStack | Single connection; **cannot** carry blocking commands like `BLPOP` |
```python
# redis-py — connection pool
pool = redis.ConnectionPool(host="localhost", port=6379, max_connections=50)
r = redis.Redis(connection_pool=pool)
```
See [references/pooling.md](references/pooling.md) for Python + Java + Lettuce examples.
## 2. Pipeline bulk work
For N commands that don't depend on each other's results, send them as a single batch with pipelining. One round-trip instead of N.
```python
pipe = redis.pipeline()
for user_id in user_ids:
pipe.get(f"user:{user_id}")
results = pipe.execute()
```
Use **non-transactional** pipelining for performance, and `pipeline(transaction=True)` only when you actually need atomicity (see redis-core's transactions guidance).
See [references/pipelining.md](references/pipelining.md).
## 3. Avoid commands that scan everything
Anything that walks the whole keyspace (or a whole large container) blocks the server. Use incremental variants instead.
| Don't | Use |
|---|---|
| `KEYS pattern` | `SCAN` cursor loop |
| `SMEMBERS large_set` | `SSCAN` |
| `HGETALL large_hash` | `HSCAN` |
| `LRANGE 0 -1` on a huge list | Paginate (`LRANGE 0 100`) |
```python
cursor = 0
while True:
cursor, keys = redis.scan(cursor, match="user:*", count=100)
for key in keys:
process(key)
if cursor == 0:
break
```
**Blocking commands (`BLPOP`, `BRPOP`, `BLMOVE`) are different** — they intentionally wait for data and are fine for queue consumers, but always pass a timeout, and don't issue them on a multiplexed connection (Lettuce, NRedisStack).
See [references/blocking.md](references/blocking.md).
## 4. Client-side caching for hot keys
For data that's read often and written rarely (config, feature flags, sessions on every request), enable RESP3 client-side caching. The client keeps a local copy and the server invalidates it on writes — saving the round trip for hot reads.
```python
client = redis.Redis(
host="localhost",
port=6379,
protocol=3, # RESP3 is required
cache_config=redis.CacheConfig(max_size=1000),
)
```
Skip it for write-heavy workloads or data that changes constantly — the invalidation traffic overruns the savings.
See [references/client-cache.md](references/client-cache.md).
## 5. Set explicit timeouts
Defaults vary by client and may be too generous. Pick values that match the *application's* failure model:
```python
r = redis.Redis(
host="localhost",
socket_connect_timeout=2.0, # fail fast on dead nodes
socket_timeout=5.0, # tune to expected operation time
retry_on_timeout=True,
)
```
Rule of thumb: connect timeout shorter than read/write timeout. Tight timeouts + retry-on-timeout for latency-sensitive paths; longer timeouts for batch jobs.
See [references/timeouts.md](references/timeouts.md).
## References
- [Redis: Connection Pools and Multiplexing](https://redis.io/docs/latest/develop/clients/pools-and-muxing/)
- [Redis: Pipelining](https://redis.io/docs/latest/develop/use/pipelining/)
- [Redis: SCAN](https://redis.io/docs/latest/commands/scan/)
- [Redis: Client-side caching](https://redis.io/docs/latest/develop/clients/client-side-caching/)
- [Redis: Clients](https://redis.io/docs/latest/develop/clients/)
© Redis, Inc. · MIT · redis/agent-skills