TTL是什么:缓存生命周期及其工作原理

作者: IT Sectr 发布日期: 2026-06-13 阅读时间: 8 分钟

TTL(Time To Live)—— 参数,用于确定数据被视为有效的最大时间。TTL到期后,记录被标记为过期(stale),并应删除或更新。根据Mozilla Developer Network(2026)TTL机制是通过Cache-Control: max-age头进行HTTP缓存的基础,并被所有现代浏览器和移动应用程序用于优化网络请求。

主要内容

  • TTL(Time To Live)—— 记录的生存时间,之后数据被视为过期并需要更新
  • 平衡—— 短TTL提供最新数据,但降低缓存效率;长TTL提高性能,但有过期风险
  • HTTP缓存—— Cache-Control: max-age头以秒为单位设置服务器响应的TTL
  • DNS记录—— TTL确定解析器将域名IP地址缓存多久(从60到86400秒)
  • 移动应用—— TTL用于缓存API响应、图片和会话数据

什么是TTL?

TTL(Time To Live)—— 是一个时间标记或间隔,之后数据被视为无效。在缓存上下文中,TTL确定一个记录在需要从原始源重新请求之前可以在缓存中存储多久。在网络协议中,TTL限制了数据包的寿命,防止无限路由。

TTL值始终以时间单位表示:毫秒、秒、分钟或小时。设定时间到期后,记录要么从缓存中删除,要么标记为stale(过期)。圩下一次对过期记录的请求时,系统可以返回过期数据并后续更新(stale-while-revalidate),或在接收到新鲜数据之前拦截请求。

选择TTL始终是数据的时效性和性能之间的折衷。TTL过短(1–5秒)会迫使应用程序频繁执行网络请求,减弱缓存的好处。TTL过长(小时/天)会增加向用户显示过期信息的风险。最佳值取决于数据类型:汇率——秒,天气——分钟,API版本——小时。

TTL和缓存失效

TTL是被动失效:数据在时间到期后自动删除。另一种方式是主动失效,数据源通知缓存变化(例如,通过WebSocket消息或push通知)。通过TTL的被动失效实现起来更简单,但不能保证即时时效性。主动失效更复杂,但可以使数据保持最新状态,而没有TTL特有的延迟。

TTL如何工作

TTL机制可以通过两种方式实现:绝对到期和相对到期。在绝对到期中,记录存储了具体的失效时间。在相对到期中,记录创建时间和TTL作为间隔被记录,检查通过计算creationTime + TTL > currentTime完成。

在每次对缓存的请求时,系统检查每个记录的TTL。如果TTL已到期,数据被删除或标记为stale,请求被引导到源。为了优化TTL检查,可以使用定时清理(定期删除所有已过期的记录)或懒惰清理(仅在访问记录时删除)。懒惰清理在内存上更高效,因为它不需要后台线程来扫描整个缓存。

在分布式系统中,TTL也用于自动解决冲突。例如,如果两台服务器同时为同一个键写入了不同的值,具有较晚TTL的记录可以被视为优先级。Amazon DynamoDB使用TTL自动删除表中的过期记录——这是内置功能,不需要手动管理。

读取过期数据的策略

为了提高TTL到期后的性能,采用读取过期数据的策略。Stale-while-revalidate—— 立即将过期数据返回给客户端,同时启动后台更新。Stale-if-error—— 如果源暂时不可用,则返回过期数据。Cache-Aside(Lazy Loading)—— 在缓存未命中时,从源加载数据,以新TTL存储在缓存中,然后返回给客户端。每种策略根据数据一致性要求进行选择。

数据缓存中的TTL

在移动应用中,TTL是缓存管理的关键机制。让我们看看TTL决定应用行为和用户体验的主要场景。

HTTP响应的缓存

HTTP协议通过Cache-Control头提供内置TTL机制。max-age指令以秒为单位设置TTL:Cache-Control: public, max-age=3600意味着响应可以缓存1小时。额外的指令s-maxage(用于共享缓存,如CDN)和stale-while-revalidate提供更精细的控制。如果TTL与xpires头重叠,max-age作为更现代的HTTP/1.1标准享有优先级。

数据类型建议TTL说明
天气10–30分钟预报不会更频繁地更新
汇率15–60秒高波动性
新闻流2–5分钟新鲜度和性能的平衡
用户资料5–30分钟在会话中很少改变
商品列表10–60分钟价格不会每秒都变
静态资源1–24小时通过URL或ETag版本管理

图片的缓存

对于图片,TTL可以达到几天,因为内容很少变化。然而,移动应用通常采用混合方法:缩略图的TTL较短(30分钟——帧的时效性),全尺寸图片的TTL较长(7天)。具有HTTP头Cache-Control: immutable的图片在TTL到期之前不应重新请求——这是RFC 8246中对静态资源的优化。这类图片在操作系统层面(URLCache、OkHttp Cache)缓存,无需应用参与。

网络协议中的TTL

在网络中,TTL不是用于缓存,而是用于限制数据包的寿命。每个IP数据包包含一个TTL字段(8比特),每个路由器将其减少1。当TTL达到0时,数据包被丢弃,并向发送者返回ICMP Time Exceeded消息。这防止了网络环路中的无限路由

DNS中的TTL

DNS记录具有TTL,确定解析器(例如,ISP的DNS缓存)在不咨询授权服务器的情况下可以存储记录多久。典型值:频繁变化的记录为300秒(5分钟),稳定域名为86400秒(24小时)。CDN服务通常设置低TTL(60–300秒)以在故障时快速重定向流量,而静态域名可以有最高7天的TTL。在迁移服务器时,建议先将TTL降低到60秒(迁移前48小时),以便变化快速传播。

会话和令牌中的TTL

在移动应用中,TTL用于管理会话和访问令牌。JWT令牌(JSON Web Tokens)包含exp字段(到期时间),是绝对的Unix到期时间。到期后,刷新令牌用于获取新的访问令牌,无需重新验证。访问令牌的TTL通常为1–24小时,刷新令牌的TTL为7–30天。这是安全(短TTL减少泄露风险)和用户体验(长TTL减少重复登录频率)之间的平衡。

TTL选择策略

选择TTL是一个工程决策,取决于数据类型、时效性SLA和重复请求的成本。让我们看看主要策略。

固定TTL

最简单的方法—— 所有记录都有相同的TTL。例如,将所有API响应缓存5分钟。优点:实现简单、行为可预测。缺点:不考虑不同数据类型的不同变化频率。固定TTL适合所有记录具有相同“新鲜度”的同质数据—— 例如,单个交易所的加密货币汇率。

自适应TTL

TTL根据数据行为动态变化。例如,如果记录在服务器上很少更新,TTL增加;如果频繁更新,TTL减少。实现可以使用HTTP响应头:Age头(响应已在缓存中的秒数)和Date头可以计算剩余寿命。自适应TTL提供更好的命中率,但需要客户端额外的逻辑。

概率到期TTL

Probabilistic Early Expiration (PEE)—— 在给定范围内随机选择TTL的技术。这防止了“盲群效应”(thundering herd),即大量请求同时到期,所有客户端同时访问源。PEE对CDN和高负荷缓存尤其有用:替代单一200秒的TTL,使用240制360秒之间的随机值,从而均匀分配源的负荷。

TTL代码示例

让我们看看在Kotlin中使用绝对到期的带TTL缓存实现。每个记录存储创建时间,并在读取时检查TTL是否已到期。

kotlin
class TtlCache<K, V>(
    private val defaultTtlMs: Long = 300000L
) {
    private data class Entry<V>(
        val value: V,
        val createdAt: Long = System.currentTimeMillis()
    )

    private val map = ConcurrentHashMap<K, Entry<V>>()

    fun get(key: K): V? {
        val entry = map[key] ?: return null
        if (isExpired(entry)) {
            map.remove(key)
            return null
        }
        return entry.value
    }

    fun put(key: K, value: V, ttlMs: Long = defaultTtlMs) {
        map[key] = Entry(value, createdAt = System.currentTimeMillis() + ttlMs)
    }

    private fun isExpired(entry: Entry<*>): Boolean {
        return System.currentTimeMillis() > entry.createdAt
    }

    fun cleanup() {
        map.entries.removeIf { isExpired(it.value) }
    }
}

Entry类存储值和创建时间 + TTL(绝对到期)。get方法在每次访问时检查是否到期(懒惰清理)—— 过期的记录仅在尝试访问时删除。cleanup方法可以定期从后台线程调用,以批量删除所有过期记录。ConcurrentHashMap确保线程安全,无需锁定整个缓存。

示例:iOS上API响应缓存的TTL

在iOS中,使用URLCache配合memoryCapacity和diskCapacity设置来进行带TTL的缓存很方便。然而,URLCache不支持不同请求的单独TTL。让我们看看一个自定义的NSCache封装器,支持TTL。

swift
final class ApiResponseCache {
    private var cache = NSCache<NSString, CacheEntry>()

    func getResponse(for url: URL) -> Data? {
        guard let entry = cache.object(forKey: url.absoluteString as NSString)
            else { return nil }
        guard entry.expirationDate > Date() else {
            cache.removeObject(forKey: url.absoluteString as NSString)
            return nil
        }
        return entry.data
    }

    func storeResponse(data: Data, for url: URL, ttl: TimeInterval) {
        let entry = CacheEntry(data: data, expirationDate: Date().addingTimeInterval(ttl))
        cache.setObject(entry, forKey: url.absoluteString as NSString)
    }
}

final class CacheEntry: NSObject {
    let data: Data
    let expirationDate: Date
}

在这个实现中,NSCache被用作线程安全的存储。CacheEntry包含Data和expirationDate。在get时检查时间是否到期;如果到期,记录被删除并返回nil。TTL通过TimeInterval以秒为单位设置,并可以根据每个URL不同:API响应的典型值为动态内容120秒,静态数据3600秒。

常见问题

TTL和数据过期日期有什么区别?

从技术上讲,TTL和过期日期是一样的:数据被视为无效的时间间隔。区别在于上下文:TTL术语用于IT领域(缓存、网络、DNS),而“过期日期”更常应用于商业逻辑(促销代码、订阅)。在实现上,两种机制是相同的—— 当前时间与到期时间的比较。

如何选择最佳TTL?

最佳TTL是通过经验选择的。方法:从保守值开始(30–60秒),逐步增加直到出现关于数据过期的投诉。监控缓存命中率:如果低于70%,TTL太短。考虑SLA:金融数据的TTL可以是1秒,新闻—— 5分钟,资料—— 30分钟。

TTL在HTTP中到期后会发生什么?

max-age到期后,浏览器或移动应用将响应视为stale(过期)。圩下一次对同一URL的请求时,客户端发送带有If-None-Match(ETag)或If-Modified-Since头的请求。如果数据未变,服务器返回304 Not Modified,无响应主体,TTL重新生效。如果数据已变,服务器返回200和新数据以及新的Cache-Control。

TTL可以是无限的吗?

从技术上讲,TTL可以非常大(max-age=31536000—— 1年),但这很少有道理。即使是静态资源也可能变化,客户端在TTL到期之前不会知道。建议使用带版本号的URL(style.css?v=2)和长TTL:文件变化时,URL变化,旧缓存自动过期。

TTL与LRU和FIFO如何关联?

TTL和淘汰策略(LRU、FIFO)解决不同的问题。TTL确定数据何时过期—— 这是时间标准。LRU和FIFO确定缓存满时删除哪些数据—— 这是空间标准。它们可以组合:如果TTL到期或缓存满(按LRU/FIFO),记录就被删除。在生产系统中,两种机制共同工作。

总结

  • TTL(Time To Live)—— 记录的生存时间,之后数据被视为过期并需要更新
  • 绝对到期—— 记录存储精确的到期时间;相对到期—— 创建时间 + 间隔
  • 平衡—— 短TTL降低缓存效率,长TTL增加数据过期的风险
  • HTTP Cache-Control—— max-age以秒为单位设置服务器响应的TTL,支持stale模式
  • DNS解析—— 从60到86400秒的TTL确定域名IP地址被缓存的时间
  • 策略—— 固定、自适应和概率TTL根据数据类型应用
  • 使用TTL与LRU/FIFO结合,实现完整的缓存生命周期管理

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读