redis-caching
Redis caching and queue patterns. Use when implementing caching, rate limiting, session storage, pub/sub, or background job queues with Redis.
Works with
---
name: redis-caching
description: Redis caching and queue patterns. Use when implementing caching, rate limiting, session storage, pub/sub, or background job queues with Redis.
license: Apache-2.0
---
# Redis Patterns
## Connection (Python)
```python
import redis.asyncio as redis
# Create pool once at startup
redis_pool = redis.ConnectionPool.from_url(
settings.REDIS_URL,
max_connections=10,
decode_responses=True
)
async def get_redis() -> redis.Redis:
return redis.Redis(connection_pool=redis_pool)
```
## Caching Pattern
```python
async def get_user(user_id: int, db: AsyncSession, r: redis.Redis) -> User:
cache_key = f"user:{user_id}"
# Try cache first
cached = await r.get(cache_key)
if cached:
return User.model_validate_json(cached)
# Cache miss — fetch from DB
user = await db.get(User, user_id)
if not user:
raise HTTPException(404, "User not found")
# Cache for 5 minutes
await r.setex(cache_key, 300, user.model_dump_json())
return user
async def invalidate_user_cache(user_id: int, r: redis.Redis):
await r.delete(f"user:{user_id}")
```
## Rate Limiting
```python
async def check_rate_limit(identifier: str, limit: int, window: int, r: redis.Redis):
"""Sliding window rate limit. Raises 429 if over limit."""
key = f"ratelimit:{identifier}"
pipe = r.pipeline()
now = time.time()
pipe.zremrangebyscore(key, 0, now - window) # Remove old entries
pipe.zadd(key, {str(now): now}) # Add current request
pipe.zcard(key) # Count requests in window
pipe.expire(key, window)
results = await pipe.execute()
if results[2] > limit:
raise HTTPException(429, f"Rate limit exceeded. Try again in {window}s.")
```
## Session Storage
```python
import secrets
async def create_session(user_id: int, r: redis.Redis) -> str:
session_id = secrets.token_urlsafe(32)
await r.setex(
f"session:{session_id}",
3600 * 24 * 7, # 7 days
json.dumps({"user_id": user_id, "created_at": time.time()})
)
return session_id
async def get_session(session_id: str, r: redis.Redis) -> dict | None:
data = await r.get(f"session:{session_id}")
return json.loads(data) if data else None
async def delete_session(session_id: str, r: redis.Redis):
await r.delete(f"session:{session_id}")
```
## Pub/Sub (Real-time)
```python
# Publisher
async def publish_event(channel: str, data: dict, r: redis.Redis):
await r.publish(channel, json.dumps(data))
# Subscriber
async def subscribe_loop(channel: str, r: redis.Redis):
async with r.pubsub() as pubsub:
await pubsub.subscribe(channel)
async for message in pubsub.listen():
if message["type"] == "message":
data = json.loads(message["data"])
await handle_event(data)
```
## Key Naming Convention
```
user:{id} # User cache
session:{token} # User session
ratelimit:{ip}:{route} # Rate limit counter
lock:{resource} # Distributed lock
queue:{name} # Task queue
```
## Rules
- Always set TTL (SETEX not SET) — never let keys grow forever
- Use pipelines for multiple operations (reduces round trips)
- Key names must be namespaced: `user:123`, not just `123`
- Use SCAN not KEYS in production (KEYS blocks Redis)
- Monitor memory: set maxmemory and maxmemory-policy in redis.conf
- For distributed locks: use Redlock algorithm, not simple SET NXMore API Design skills
lark-event
larksuite/cli
Lark/Feishu real-time event listening / subscribing / consuming: stream events as NDJSON via `lark-cli event consume <EventKey>` (covers IM messages/reactions/chat changes, Approval status changes, Task updates, VC meeting started/joined/ended, Minutes generated, Whiteboard updated, etc.). Use for Lark bots, real-time message processing, long-running subscribers, streaming webhook/push handlers. Supports `--max-events` / `--timeout` bounded runs and a stderr ready-marker contract — designed for AI agents running as subprocesses.
lark-contact
larksuite/cli
飞书 / Lark 通讯录:按姓名 / 邮箱解析成 open_id,或按 open_id 反查姓名 / 部门 / 邮箱 / 联系方式 / 个人状态 / 签名,以及按关键词搜索当前用户可见的机器人 / 智能体(agent)。当用户提到一个名字要下一步发消息 / 排日程,或拿到 open_id 想查具体信息时使用。不负责部门树遍历、按部门列员工、组织架构图,这类需求走原生 OpenAPI。
lark-openapi-explorer
larksuite/cli
飞书/Lark 原生 OpenAPI 探索:从官方文档库中挖掘未经 CLI 封装的原生 OpenAPI 接口。当用户的需求无法被现有 lark-* skill 或 lark-cli 已注册命令满足,需要查找并调用原生飞书 OpenAPI 时使用。

