Agent Skills
› kinncj/Heimdall
› redis-patterns
redis-patterns
GitHub提供Redis集成最佳实践,包括缓存旁路、限流及会话存储模式。定义键命名规范,强调设置TTL、使用SCAN和管道操作等规则,确保高性能与稳定性。
Trigger Scenarios
需要实现Redis缓存策略
构建API限流功能
配置Redis会话存储
Install
npx skills add kinncj/Heimdall --skill redis-patterns -g -y
SKILL.md
Frontmatter
{
"name": "redis-patterns",
"description": "Apply Redis data structure, caching, and pub\/sub patterns. Use when integrating Redis into a service."
}
SKILL: Redis Patterns
Key Design Convention
{app}:{domain}:{entity}:{id}
# Examples:
myapp:user:session:usr_123
myapp:product:cache:prod_456
myapp:rate:api:ip_1.2.3.4
myapp:queue:emails:pending
Cache-Aside Pattern
async function getUser(id: string): Promise<User> {
const key = `myapp:user:data:${id}`;
const ttl = 3600; // 1 hour
// Try cache first
const cached = await redis.get(key);
if (cached) {
return JSON.parse(cached) as User;
}
// Cache miss — fetch from DB
const user = await db.users.findById(id);
if (!user) throw new Error('User not found');
// Store in cache with TTL
await redis.setex(key, ttl, JSON.stringify(user));
return user;
}
// Invalidate on update
async function updateUser(id: string, data: Partial<User>): Promise<User> {
const user = await db.users.update(id, data);
await redis.del(`myapp:user:data:${id}`);
return user;
}
Rate Limiting with Sorted Set
async function rateLimit(ip: string, limit: number, windowSeconds: number): Promise<boolean> {
const key = `myapp:rate:api:${ip}`;
const now = Date.now();
const windowStart = now - (windowSeconds * 1000);
const pipeline = redis.pipeline();
pipeline.zremrangebyscore(key, 0, windowStart);
pipeline.zadd(key, now, `${now}`);
pipeline.zcard(key);
pipeline.expire(key, windowSeconds);
const results = await pipeline.exec();
const count = results?.[2]?.[1] as number;
return count <= limit;
}
Session Store
// Using ioredis with connect-redis
import session from 'express-session';
import RedisStore from 'connect-redis';
app.use(session({
store: new RedisStore({ client: redis }),
secret: process.env.SESSION_SECRET!,
resave: false,
saveUninitialized: false,
cookie: {
secure: process.env.NODE_ENV === 'production',
httpOnly: true,
maxAge: 1000 * 60 * 60 * 24, // 24 hours
}
}));
Rules
- ALWAYS set TTLs on cache keys — never store indefinitely.
- Use SCAN not KEYS in production (non-blocking).
- Use pipelining for multiple operations.
- Key convention:
{app}:{domain}:{entity}:{id}. - Monitor with:
redis-cli info memoryandredis-cli monitor(dev only). - Set
maxmemory-policy allkeys-lrufor cache-only Redis instances.
Version History
- f4ea31f Current 2026-07-05 10:42


