agentsclimarketplace

Redis patterns

Skill Mattakushi432/Claude-Code-Skills-Custom-DevTools-Pack/plugins/devtools-pack/skills/redis-patterns

A curated pack of custom Claude Code skills for developers — installable as a Claude Code plugin marketplace.

Install
npx -y skills add Mattakushi432/Claude-Code-Skills-Custom-DevTools-Pack --skill redis-patterns

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

When to activate: Redis, cache, pub/sub, streams, Lua, cluster, persistence, rate limiting, session store, queue

SKILL.md

4.2 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it

Redis Patterns

Core Data Structures

# Strings — counters, cache
SET user:1:name "Alice" EX 3600
INCR page:views
SETNX lock:resource 1  # atomic set if not exists

# Hashes — objects
HSET user:1 name "Alice" email "[email protected]" age 30
HGETALL user:1
HINCRBY user:1 login_count 1

# Lists — queues, feeds
LPUSH queue:jobs task1 task2   # push left
BRPOP queue:jobs 30            # blocking pop right
LRANGE feed:user:1 0 49        # paginate

# Sets — unique items, social graphs
SADD user:1:friends 2 3 4
SINTERSTORE common_friends user:1:friends user:2:friends

# Sorted Sets — leaderboards, priority queues
ZADD leaderboard 1500 "user:1"
ZREVRANGE leaderboard 0 9 WITHSCORES  # top 10
ZRANGEBYSCORE events 1700000000 1700086400  # time window

Pub/Sub and Streams

# Pub/Sub (fire and forget — no persistence)
SUBSCRIBE channel:notifications
PUBLISH channel:notifications '{"type":"alert","msg":"hello"}'

# Streams — persistent, consumer groups
XADD events:stream * type "click" user_id "42"
XGROUP CREATE events:stream workers $ MKSTREAM
XREADGROUP GROUP workers consumer1 COUNT 10 BLOCK 2000 STREAMS events:stream >
XACK events:stream workers <message-id>

# Python stream consumer
import redis
r = redis.Redis()
while True:
    msgs = r.xreadgroup('GROUP', 'workers', 'c1', count=10,
                         block=2000, streams={'events:stream': '>'})
    for stream, messages in (msgs or []):
        for msg_id, data in messages:
            process(data)
            r.xack('events:stream', 'workers', msg_id)

Lua Scripting (Atomic Operations)

-- Rate limiter (sliding window)
local key = KEYS[1]
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])

redis.call('ZREMRANGEBYSCORE', key, 0, now - window)
local count = redis.call('ZCARD', key)
if count < limit then
  redis.call('ZADD', key, now, now)
  redis.call('EXPIRE', key, window / 1000)
  return 1
end
return 0
rate_limit_script = r.register_script(lua_script)
allowed = rate_limit_script(
    keys=[f'rate:{user_id}'],
    args=[int(time.time() * 1000), 60000, 100]  # 100 req/min
)

Caching Patterns

# Cache-aside (most common)
def get_user(user_id):
    cached = r.get(f'user:{user_id}')
    if cached:
        return json.loads(cached)
    user = db.query(User).get(user_id)
    r.setex(f'user:{user_id}', 300, json.dumps(user.to_dict()))
    return user

# Cache stampede prevention (probabilistic early expiration)
def get_with_lock(key, ttl, fetch_fn):
    val = r.get(key)
    if val:
        return json.loads(val)
    lock_key = f'lock:{key}'
    if r.set(lock_key, 1, nx=True, ex=10):
        val = fetch_fn()
        r.setex(key, ttl, json.dumps(val))
        r.delete(lock_key)
        return val
    time.sleep(0.1)
    return get_with_lock(key, ttl, fetch_fn)

Cluster and Persistence

# Cluster — 16384 hash slots across nodes
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
  127.0.0.1:7002 --cluster-replicas 1

# Hash tags for multi-key atomicity in cluster
SET {user:1}:profile "..."
SET {user:1}:settings "..."  # same slot as profile

# Persistence config
# RDB: snapshot every N seconds if M keys changed
save 900 1
save 300 10
# AOF: append-every-second (balance durability vs perf)
appendonly yes
appendfsync everysec

# INFO persistence
redis-cli INFO persistence

Common Patterns

# Distributed lock (Redlock)
from redis import Redis
from redlock import Redlock

dlm = Redlock([{"host": "redis1"}, {"host": "redis2"}])
lock = dlm.lock("resource", 10000)  # 10s TTL
if lock:
    try:
        do_work()
    finally:
        dlm.unlock(lock)

# Session store
r.setex(f'session:{token}', 86400, json.dumps(session_data))

# Bloom filter (RedisBloom module)
r.execute_command('BF.ADD', 'seen_emails', '[email protected]')
exists = r.execute_command('BF.EXISTS', 'seen_emails', '[email protected]')

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 327,069. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.