用途
本技能聚焦后端缓存策略,使用 Redis 实现多种缓存模式与失效机制,目标是优化性能并保持缓存与数据源之间的一致性。资料以 Python 异步代码(redis.asyncio)示例说明各模式的落地方式。
主要能力
缓存模式选择
资料提供模式选择表,从写入方式、读取方式、一致性、适用场景四个维度对比:
- Cache-Aside:先写数据库,读取时先查缓存再查数据库,最终一致性,通用场景。
- Write-Through:同时写缓存与数据库,读取只走缓存,强一致性,关键数据。
- Write-Behind:写缓存、异步写数据库,读取走缓存,最终一致性,高写入负载。
- Read-Through:由缓存处理读取,缓存未命中时回源数据库,最终一致性,简化读取逻辑。
Cache-Aside(懒加载)
提供 CacheAside 类,核心方法 get_or_set:先尝试从 Redis 读取,命中则反序列化返回;未命中则调用 fetch_fn 获取数据,再以 setex 写入缓存并返回。示例中为 get_analysis 设置 1800 秒(30 分钟)TTL。
Write-Through
提供 WriteThroughCache 类:write 方法先同步写数据库(保证一致性),再以 setex 更新缓存;read 方法只从缓存读取。示例用于 update_analysis。
Write-Behind(写回)
提供 WriteBehindCache 类:write 立即写缓存并将待写项加入队列,达到 batch_size 时触发批量落库;后台 _flush_loop 按 flush_interval 周期刷新;stop 时取消任务并刷新剩余写入;_flush_pending 以 bulk_upsert 批量写数据库。
缓存失效模式
- TTL 失效:使用 setex 设置过期时间;可加入抖动(jitter,示例为 ±300 秒)防止缓存雪崩。
- 事件驱动失效:CacheInvalidator 提供 invalidate(删除单键)、invalidate_pattern(用 scan_iter 按模式删除)、invalidate_tags(按标签集合删除相关键)。
- 版本号失效:VersionedCache 通过 version:{namespace} 维护版本,键名格式为 {namespace}:v{version}:{key},increment_version 递增版本即可使整个命名空间失效。
缓存击穿防护
StampedeProtection 使用 Redis 分布式锁(set nx=True, ex=timeout)防止大量请求同时回源;未获取锁时轮询等待数据出现;获取锁后二次检查缓存,再计算并写回。示例中 get_expensive_data 展示了完整用法。
使用方式
资料以代码示例形式给出各模式的类定义与调用方式,包括:
- 初始化:如 CacheAside(redis_client)、WriteThroughCache(redis_client)、WriteBehindCache(redis_client, flush_interval, batch_size)。
- 调用:get_or_set、write、read、invalidate、invalidate_tags、lock 等。
- 序列化:示例默认使用 json.dumps/json.loads,关键决策中建议使用 orjson 以提升性能。
适用场景
- 需要降低数据库读取压力、实现懒加载缓存的读取密集场景。
- 对一致性要求高、需同步更新缓存与数据库的关键数据。
- 写入吞吐量高、可接受异步落库的场景。
- 需要按 TTL、事件、标签或版本号灵活失效缓存的系统。
- 存在热点键、需防止缓存击穿(thundering herd)的高并发场景。
关键决策建议
资料给出以下建议:默认 TTL 多数数据 1 小时、易变数据 5 分钟;序列化推荐 orjson;键命名采用 {entity}:{id} 或 {entity}:{id}:{field};昂贵计算使用锁防击穿;写入用事件驱动失效、读取用 TTL。
限制与反模式
资料明确列出禁止做法:不得缓存时不设 TTL(内存泄漏);不得缓存敏感数据而不加密;不得将缓存作为主存储;不得忽略缓存失败(静默失败会导致脏数据)。
相关技能
资料提及 redis-patterns(高级 Redis 用法)、resilience-patterns(回退策略)、observability-monitoring(缓存命中指标)。
暂未提供
资料未提供具体安装命令、依赖版本、收费或价格信息、性能基准数据,以及除 Python 异步示例外的其他语言实现。