1 简介
当缓存中的数据不再有用时,我们可能需要删除它们,否则过时的数据永久停留在缓存中将造成内存和计算资源的浪费。
过期策略包括惰性删除、定期删除和内存淘汰,如LRU、LFU和随机淘汰。
服务端无法直接控制客户端缓存,可能导致过时信息的使用,尤其是当URI不变时。
正确的过期期限设置是平衡性能和数据新鲜度的关键,过短会频繁请求,过长则可能导致数据过时和缓存溢出。
2 管理缓存中的数据过期时间
在大多数情况下,缓存中保存的数据是原始数据存储中保存的数据的副本。原始数据存储中的数据在缓存后可能会更改,从而导致缓存的数据过时。许多缓存系统使您能够将缓存配置为使数据过期并缩短数据可能过期的时间段。
当缓存的数据过期时,它将从缓存中删除,应用程序必须从原始数据存储中检索数据(它可以将新提取的信息放回缓存中)。您可以在配置缓存时设置默认过期策略。
在许多缓存服务中,当您以编程方式将单个对象存储在缓存中时,还可以规定这些对象的过期期限。
某些缓存允许您将过期期限指定为绝对值,或指定为滑动值,如果项目未在指定时间内访问,则会导致从缓存中删除项目。此设置将覆盖任何缓存范围的过期策略,但仅适用于指定的对象。
3 缓存的过期策略
1 惰性删除(在查询key时才检测是否过期,缺点低频key不会被删除)
2 定期删除(每隔一段时间则随机删除一些过期key)
3 内存淘汰
已设置过期时间 volatile
lru 最近最少使用
lfu 总的最少使用
random 随机淘汰算法
ttl 生存时间淘汰
未设置过期时间 allkeys
lru 所有key最近最少使用
lfu 所有key最不经常使用
random 所有key随机淘汰
某些缓存实现可能会提供其他逐出策略。有几种类型的逐出策略。其中包括:
最近使用的策略(预期不再需要数据)。
先进先出策略(首先逐出最旧的数据)。
基于触发事件(例如正在修改的数据)的显式删除策略。
使客户端缓存中的数据失效,客户端缓存中保存的数据通常被视为不在向客户端提供数据的服务的支持下。服务不能直接强制客户端在客户端缓存中添加或删除信息。
这意味着使用配置不佳的缓存的客户端可能会继续使用过时的信息。
例如,如果未正确实现缓存的过期策略,则当原始数据源中的信息发生更改时,客户端可能会使用本地缓存的过时信息。
如果生成通过 HTTP 连接提供数据的 Web 应用程序,则可以隐式强制 Web 客户端(如浏览器或 Web 代理)获取最新信息。
如果资源通过更改资源的 URI 进行更新,则可以执行此操作。Web 客户端通常使用资源的 URI 作为客户端缓存中的键。
因此,如果 URI 发生更改,Web 客户端将忽略资源的任何以前缓存的版本,而是提取新版本。
4 小结
请仔细考虑缓存及其包含的对象的过期期限。如果设置得太短,对象将过期太快,并且会降低使用缓存的好处。如果使时间段过长,则数据可能会过时。
如果允许数据长时间驻留,缓存也可能会填满。
在这种情况下,任何向缓存添加新项的请求都可能导致在称为逐出的过程中强制删除某些项。
缓存服务通常基于最近最少使用 (LRU) 逐出数据,但您通常可以替代此策略并防止逐出项目。
但是,如果采用此方法,则可能会超出缓存中的可用内存。尝试将项添加到缓存的应用程序将失败并出现异常。