Azure 角色中缓存中的过期和收回
重要
Microsoft 建议所有新开发使用 Azure Redis 缓存。 有关选择 Azure 缓存产品/服务的当前文档和指南,请参阅 哪个 Azure 缓存产品/服务适合我?
Microsoft Azure缓存不会永久保留内存中的缓存对象。 除了通过使用 Remove 方法从缓存中显式删除之外,缓存对象也可能过期或被缓存群集逐出。
过期时间
缓存过期允许缓存群集自动将缓存对象从缓存中删除。 当使用 Put 或 Add 方法时,可以为特定的缓存对象设置一个可选的对象超时值,该值将确定此对象在缓存中驻留的时间。 如果缓存对象时未提供对象超时值,则缓存对象将使用默认过期时间。
使用基于角色的缓存时,有三个选项用于过期:
有效期限类型 | 说明 |
---|---|
无 |
过期已禁用。 项目将保留在缓存中,直到被逐出或缓存群集重新启动。 |
Absolute |
项目在创建后的指定时间内过期。 |
滑动 |
项目在上次访问后的指定时间内过期。 每次访问对象时,将重置滑动时间窗口。 这会延长经常使用的项目在缓存中的保留时间。 |
注意
请务必注意滑动过期在与本地缓存结合使用时的行为。 如果项目是从本地缓存中读取的,则不会访问缓存群集上的对象。 因此,即使在本地读取项目,该项目也会在服务器上过期。
在共享缓存中,过期始终是绝对的,无法设置默认过期时间。 共享缓存中的项目在 48 小时后过期。 但是,可以使用 Put 和 Add 方法在代码中设置显式过期时间。 请注意,ASP.NET 提供程序将自动使用这些重载为会话状态和输出缓存提供明确的超时。 在任一情况下,当缓存大小超过共享缓存产品/服务的限制时,缓存中最近使用过的项将被逐出。
当出于并发的目的锁定缓存对象时,即使这些对象的过期时间已过,也不会从缓存中删除这些对象。 一旦解锁这些对象,会立即将其从缓存中删除(如果其过期时间已过)。
为了防止在解锁过期对象时立即删除这些对象,Unlock 方法还支持延长缓存对象的过期时间。
本地缓存失效
本地缓存有两种互补类型的无效:基于超时的无效和基于通知的无效。
提示
将对象存储在本地缓存中之后,无论这些对象是否被缓存群集上的其他客户端更新,你的应用程序都可以使用这些对象,直到这些对象失效。 因此,最好为很少更改的数据启用本地缓存。
基于超时的失效
将对象下载到本地缓存之后,这些对象将驻留在本地缓存中,直到其达到缓存客户端配置设置中指定的对象超时值。 达到此超时值之后,对象将失效,以便下次请求时可以从缓存群集刷新。
基于通知的失效
如果缓存客户端启用了本地缓存,则还可以使用缓存通知使本地缓存的对象自动失效。 根据需要缩短这些对象的生存期,这样可以降低应用程序使用过时数据的可能性。
注意
共享缓存不支持通知。
使用缓存通知时,应用程序会定期向缓存群集查询,以了解是否有任何新的通知可用。 此间隔称为轮询间隔,默认情况下为每 300 秒。 在应用程序配置设置中,轮询间隔是以秒为单位指定的。 注意,即使对于基于通知的失效,超时也仍然适用于本地缓存中的项目。 这使得基于通知的失效成为基于超时的失效的补充。
有关详细信息和示例,请参阅 Azure In-Role 缓存中的本地缓存。
逐出
为了保持每个缓存主机上可用于 Caching 的内存容量,支持最近最少使用 (LRU) 逐出。 阈值用于确保内存在群集中的所有缓存主机之间均匀地分布。 此阈值由两个因素决定:每台计算机上的可用物理内存量和每个计算机上的缓存内存的百分比。
在内存使用量超出内存阈值时,在内存压力得到缓解之前,将从内存中逐出对象,无论这些对象是否已到期。 因此,可能会将缓存对象重新路由到缓存群集中的其他计算机,以保持最佳的内存分布。
警告
如果禁用逐出,则存在限制风险。 在此情况下,内存已超出阈值,但却无法缓减内存不足的问题。 在问题解决之前,客户端在尝试将项目添加到此状态下的缓存时会收到一个异常。 请注意,共享缓存不支持在缓存上禁用逐出。
指定过期和逐出设置
在群集配置设置中,在命名的缓存级别配置过期和逐出行为。
可以使用以下方法覆盖缓存中的默认设置:
PutAndUnlock 和 Unlock 方法提供重载,使你可以在解锁对象后延长对象的过期时间。
ResetObjectTimeout 方法允许显式扩展对象的生存期,从而替代缓存的过期设置。
无论是过期设置还是逐出设置,如果重新启动缓存群集,则会清除缓存中的所有对象。 如果未在缓存中找到任何数据,则应用程序代码必须从数据源重新加载缓存。 这通常称为缓存端编程模式。