SuperAPI AI 工具集

redis-patterns

数据与分析

查看项目

更新于 10-15 09:43

技能介绍

Redis Patterns 是一份围绕 Redis 的实践模式参考,主题是“用 Redis 高效实现缓存、消息与分布式协调”。资料以代码示例和对照表的形式给出具体做法,以下按用途整理。

一、用途 面向需要在应用中正确使用 Redis 的开发者,提供缓存、消息传递、限流、分布式锁、会话存储等常见场景的实现模式,并附带键命名、性能优化与反模式提示。

二、主要能力

  1. 数据结构选型:以“需求—结构—示例”对照表给出选择依据。简单缓存用 String(SET user:123 '{"name":"Jo"}');对象字段用 Hash(HSET user:123 name Jo email jo@x.com);唯一集合用 Set(SADD online_users user:123 user:456);排名项用 Sorted Set(ZADD leaderboard 100 user:123);消息队列用 List(LPUSH tasks '{"type":"email"}');最近项用带 LTRIM 的 List;实时消息用 Pub/Sub(PUBLISH events '{"type":"deploy"}');事件日志用 Stream(XADD events * type deploy organ IV)。
  2. 缓存模式:Cache-Aside(懒加载)先查缓存,未命中再查数据库并用 setex 写入并设置 TTL(示例为 1 小时);Write-Through 在更新数据库后同步更新缓存;缓存失效提供按 key 删除与按模式扫描删除(scan_iter)两种方式;缓存击穿防护通过 SET NX 加锁(示例 10 秒锁),未获锁的进程短暂等待后重试。
  3. 发布/订阅:基础发布者用 publish,订阅者用 pubsub().subscribe 并遍历 listen 处理消息;Redis Streams 提供持久化消息,示例包含 xadd 生产、xgroup_create 创建消费者组、xreadgroup 消费与 xack 确认。
  4. 限流:滑动窗口用有序集合配合 pipeline,执行 zremrangebyscore、zadd、zcard、expire 后判断计数是否超限;令牌桶用 Lua 脚本实现,按速率与容量计算令牌并原子扣减。
  5. 分布式锁:acquire_lock 用 SET NX EX 加锁并返回随机 token;release_lock 用 Lua 脚本校验 token 后删除,保证只释放自己持有的锁。
  6. 会话存储:用 Hash 存储会话字段并设置过期时间,提供 get_session 读取与 extend_session 续期。
  7. 键命名约定:给出 {entity}:{id}、{entity}:{id}:{field}、{scope}:{entity}:{id}、{function}:{entity}:{id} 等命名形式及示例。
  8. 性能模式:Pipelining 批量发送命令后统一执行;需要多操作原子性时使用 Lua 脚本(Redis 将 Lua 作为单个原子操作执行);内存管理给出 maxmemory 策略说明,如 allkeys-lru(适合缓存)、volatile-lru(仅淘汰设置了 TTL 的键)、noeviction(内存满时返回错误,适合队列)。

三、使用方式 资料以 Python redis 客户端代码片段为主,展示各模式的调用方式,包括 r.get/setex、hset/hgetall、publish/pubsub、xadd/xreadgroup/xack、pipeline、eval 执行 Lua 等。示例中出现的键名、TTL、锁超时、限流阈值等均为示例值,实际使用需按场景调整。

四、适用场景 缓存读写与失效、缓存击穿防护、事件发布订阅与持久化消息消费、接口限流、跨进程互斥、会话数据存储,以及需要批量操作或原子操作的 Redis 使用场景。

五、限制与注意事项 资料列出的反模式包括:把 Redis 当作主数据库(Redis 默认是易失的,应作为缓存或协调层)、键无界增长(应始终设置 TTL 或实现清理)、值过大(建议保持在 100KB 以下,更大数据用引用)、在生产环境阻塞使用 KEYS 命令(应改用 SCAN)、缺少错误处理(应处理 ConnectionError 与 TimeoutError)。此外,资料未提供安装步骤、版本要求、性能基准数据、收费信息或具体平台支持说明,这些内容暂未提供。