SuperAPI AI 工具集

caching-strategies

编程与开发

查看项目

更新于 10-16 03:59

技能介绍

用途

本技能聚焦后端缓存策略,使用 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 异步示例外的其他语言实现。