SuperAPI AI 工具集

caching-strategies

部署与运维

查看项目

更新于 10-15 07:47

技能介绍

Caching Strategies 是一份面向缓存策略与实现的知识指南,覆盖从浏览器和 CDN 到应用、数据库与分布式系统的各层缓存。资料指出,合理的缓存可以显著降低延迟、减少基础设施成本并改善用户体验。

一、缓存基础概念 资料定义了以下核心术语:缓存命中(Cache Hit):请求数据在缓存中找到,无需回源;缓存未命中(Cache Miss):数据不在缓存中,必须从源获取并可选择存储;TTL(Time-To-Live):缓存条目在过期前保持有效的时长;淘汰(Eviction):容量达到上限或策略触发时移除缓存条目;脏数据(Stale Data):相对数据源已过期的缓存数据;缓存预热(Cache Warming):在流量到来前预先填充缓存;缓存雪崩(Cache Stampede):大量并发请求命中同一个未缓存键,压垮源站。

淘汰策略方面,资料列出了 LRU(淘汰最久未访问条目,适用于通用负载)、LFU(淘汰访问次数最少的条目,适用于访问频率偏斜的场景)、FIFO(淘汰最旧条目,与访问无关,适合简单可预测的轮换)、基于 TTL(固定时长后淘汰,适合时间敏感数据)、随机(淘汰随机条目,适合简单性优先于精确性的场景)以及 ARC(自适应替换缓存,动态平衡新近度与频率,适合混合访问模式)。

二、HTTP 缓存 资料将 HTTP 缓存视为第一道防线,指出正确的头部可以完全避免不必要的网络请求。给出的 Cache-Control 示例包括:public, max-age=3600, stale-while-revalidate=60(公开缓存 1 小时,重新验证期间允许 60 秒的过期内容);private, no-cache(仅浏览器私有缓存,每次重新验证);no-store(敏感数据,绝不缓存);public, max-age=31536000, immutable(带哈希文件名的不可变资源)。

指令参考涵盖 public、private、no-cache、no-store、max-age=N、s-maxage=N(对共享缓存覆盖 max-age)、stale-while-revalidate=N、stale-if-error=N、immutable、must-revalidate。

条件请求部分给出 ETag 与 If-None-Match 的 Express.js 示例,通过 md5 生成 ETag,匹配时返回 304,并设置 Cache-Control 为 private, no-cache 及 Last-Modified;另给出 Flask 的 Last-Modified 与 If-Modified-Since 示例,并展示 Vary 头部按 Accept-Encoding、Accept-Language 或 Authorization 缓存不同版本。

三、浏览器缓存策略 资料给出 Service Worker 的 stale-while-revalidate 策略:先返回缓存内容,同时在后台请求新副本并写入缓存;以及 network-first with fallback 策略:优先请求网络,成功后克隆并缓存响应,失败时从缓存匹配。静态资源缓存版本化方面,展示了 webpack 的 contenthash 文件名用于缓存清除,以及 Nginx 对哈希资源设置一年缓存并加 immutable、对 HTML 设置 5 分钟并加 no-cache 的配置。

四、CDN 缓存 资料包含 Cloudflare Page Rules / Cache Rules 示例:对 /api/public/* 路径缓存一小时(Cache Level: Cache Everything、Edge Cache TTL 3600、Browser Cache TTL 300),对 /api/user/* 认证路由绕过缓存。AWS CDK 示例展示 CloudFront Cache Policy 的构造,设置默认 TTL 1 小时、最小 1 分钟、最大 1 天,header 允许列表为 Accept 和 Accept-Language,查询字符串全部参与缓存,不缓存 cookie,并启用 gzip 与 Brotli。Fastly VCL 片段展示:对静态资源去除 Cookie 以提高命中率,带 Authorization 的请求直接 pass 到源站,并在 vcl_fetch 中对 /api/public/ 设置 300 秒边缘 TTL。

五、应用层缓存模式 资料介绍了四种模式。Cache-Aside(懒加载):应用先查缓存,未命中则从源获取、写入缓存并返回,示例使用 Python 与 Redis 的 setex。Read-Through:由缓存自身在未命中时加载数据,应用始终读缓存,示例使用 Java Caffeine 的 LoadingCache,含 maximumSize、expireAfterWrite、refreshAfterWrite。Write-Through:数据同时写入缓存与源,保证缓存一致,示例为 TypeScript 的 WriteThroughCache 类,先写源再更新缓存。Write-Behind(Write-Back):写入先落缓存并异步批量刷到源,提高写吞吐,示例为 Python 的 WriteBehindCache,含后台 flush 线程与队列。

六、内存缓存 资料给出多语言示例:Node.js 使用 lru-cache(max、maxSize、sizeCalculation、ttl、allowStale、updateAgeOnGet);Python 使用 functools.lru_cache 做记忆化,以及 cachetools 的 TTLCache 配合 @cached 装饰器;Java 使用 Guava CacheBuilder(maximumSize、expireAfterWrite、refreshAfterWrite、recordStats,并打印命中统计);Go 使用 sync.RWMutex 与 map 实现带过期时间的简单缓存,并含定期清理 goroutine。

七、分布式缓存 资料给出 Redis 缓存模式示例:使用命名空间:实体:id:字段 形式的缓存键,get 未命中后回源并 setex,使用 SCAN 按模式批量失效某用户的所有键,以及用 pipeline 批量预热缓存。另有 Redis 与 Memcached 的对比表:数据结构(Redis 支持字符串、列表、集合、哈希、有序集合、流;Memcached 仅字符串)、持久化(Redis 有 RDB 快照与 AOF;Memcached 无)、复制(Redis 内置主从;Memcached 无,需客户端分片)、发布订阅(Redis 有;Memcached 无)、Lua 脚本(Redis 有;Memcached 无)、最大值大小(Redis 512 MB;Memcached 默认 1 MB)。

八、适用场景与限制 该资料适合在需要添加缓存、缓存 API 响应、搭建 CDN 缓存、配置 HTTP 缓存等任务时作为参考指南。资料以概念表、指令参考、配置片段和代码示例为主,未提供具体的安装命令、价格、平台限制或效果数据;具体实现需结合所用语言、框架与缓存服务的实际环境。