TTL
概要
TTL(Time to Live,生存时间)是给数据或网络数据包设定的有效期。超过 TTL 的数据会作为“过期”被自动删除,或者需要重新获取。DNS 记录、CDN 缓存、数据库的记录、网络数据包等,Web 技术的好几个层面都在使用 TTL 的概念。
DNS 中的 TTL
DNS 记录的 TTL,指定解析器(DNS 缓存服务器)缓存这条记录的秒数。TTL 为 3600(1 小时)的记录,解析器会缓存 1 小时,在此期间不向权威 DNS 服务器查询。
TTL 的设定是一种取舍。较长的 TTL 能减少对 DNS 服务器的查询次数,提高域名解析的速度。较短的 TTL 能让变更更快生效,但会增加 DNS 服务器的负载。有一种运维做法是:对变化少的记录设定 1 小时到 24 小时左右的 TTL,计划变更 DNS 记录时,事先把 TTL 暂时调短。
数据库中的 TTL
在 DynamoDB 中,对表启用 TTL 后,给记录设定 TTL 属性(Unix 时间戳),记录就会在过期后被自动删除。适合管理会话信息、临时令牌、缓存数据等经过一定时间后就不再需要的数据。
在提问箱这样的 Web 服务中,有这样的用法:给会话 ID 设定 TTL 来管理登录会话的有效期,或者给一次性令牌设定较短的 TTL 来防止重复使用。与用批处理定期清理旧记录的方式相比,用 TTL 自动删除运维的工夫更少,也不容易漏删。
CDN 缓存中的 TTL
在 CDN(Content Delivery Network)中,用 TTL 来控制把从源服务器获取的内容缓存在边缘服务器上的时长。可以考虑这样区分使用:对静态资源(图片、CSS、JavaScript)设定较长的 TTL,对动态内容(API 响应)不缓存或设定极短的 TTL。
对静态资源设定较长的 TTL 时,在文件名中加入哈希值(例:main.a1b2c3.js),内容更新时就会自动变成新的 URL,可以避免引用到旧缓存的问题。这种手法叫作缓存清除,在 Next.js 中,一旦发布就不再改变内容的静态文件,其名称里都含有哈希值。