用途
Redis Patterns 是一份面向常见后端用例的 Redis 最佳实践速查参考,用于在应用中引入缓存、限流、分布式协调、会话存储、消息传递以及生产环境配置时,提供可直接参考的实现模式与代码示例。
主要能力
数据结构速查
按用例推荐数据结构与键示例:简单缓存用 String(如 product:123)、用户会话用 Hash(如 session:abc)、排行榜用 Sorted Set(如 scores:weekly)、独立访客用 Set(如 visitors:2024-01-01)、活动流用 List(如 feed:user:456)、事件流用 Stream(如 events:orders)、计数器与限流用 String 的 INCR(如 ratelimit:user:123)、基数统计用 HyperLogLog(如 hll:pageviews)。
核心模式
- Cache-Aside(懒加载):先查缓存,未命中则查数据库并用
setex写入缓存(示例 TTL 为 1 小时)。 - Write-Through Cache:先写数据库,再立即更新缓存。
- 缓存失效:基于标签的方式,将相关键归入一个 Set,通过删除标签集合中的键批量失效。
- 会话存储:使用 Hash 存储会话数据并通过 pipeline 设置过期时间,提供创建、获取、删除会话的示例。
限流
- 固定窗口(简单):使用 pipeline 执行 INCR 与 EXPIRE,判断计数是否超过限制。
- 滑动窗口(Lua 原子脚本):通过 ZREMRANGEBYSCORE、ZCARD、ZADD 等命令在 Lua 脚本中实现精确的逐用户限流,并使用序列号避免同一毫秒内的成员冲突。
分布式锁
单节点使用 SET NX PX 获取锁(携带唯一 token),释放锁时通过 Lua 脚本校验 token 后删除键,确保只释放自己持有的锁。多节点场景建议使用 redlock-py 库实现完整的 Redlock 算法。
发布订阅与 Streams
- Pub/Sub(发后即忘):提供发布者与阻塞式订阅者示例。
- Redis Streams(持久队列):使用
xadd生产事件(可限制流长度),使用消费者组保证至少一次投递,消费后通过xack确认。需要投递保证、消费者组或重放能力时应优先选择 Streams。
键设计
给出命名约定模式(如 resource:id:field、namespace:resource:id、resource:date),并给出 TTL 建议表:用户会话 24 小时、API 响应缓存 5–15 分钟、限流窗口与窗口大小一致、短期令牌 5–10 分钟、排行榜 1 小时至 24 小时、静态或参考数据 1 小时至 1 周。强调始终设置 TTL,否则键会无限累积并造成内存压力。
连接管理
提供连接池(ConnectionPool)配置示例,包含最大连接数、超时与响应解码等参数;集群模式使用 RedisCluster;高可用使用 Sentinel,并区分主从连接。
淘汰策略
列出各策略及适用场景:noeviction(队列与关键数据)、allkeys-lru(通用缓存)、volatile-lru(混合数据存储)、allkeys-lfu(倾斜访问模式)、volatile-ttl(优先保留长寿命数据),可通过 redis.conf 的 maxmemory-policy 设置。
反模式与缓存击穿预防
反模式表列出:无 TTL 键、生产环境使用 KEYS *、存储大对象、单一 Redis 承载所有用途、忽略连接池上限、未处理缓存未命中惊群、随意 FLUSHALL,并给出对应修复方式。缓存击穿预防示例通过进程内锁在未命中时只允许一个请求回源,并提示多进程部署时应替换为分布式锁。
使用方式
资料以速查表、代码片段和示例说明的形式组织,可直接参考其中的 Python 与 Lua 代码示例,在应用中按对应模式实现相关功能。
适用场景
适用于为应用添加缓存、实现限流或节流、构建分布式锁或协调机制、设置会话或令牌存储、使用 Pub/Sub 或 Redis Streams 做消息传递,以及在生产环境配置 Redis(连接池、淘汰策略、集群)等场景。
限制
资料未说明支持的具体 Redis 版本、各模式的性能基准数据以及授权与收费信息,这些内容暂未提供。