5.4. 带有生命周期和最大闲置的过期时间
expiration 配置 Data Grid,以便在达到以下时间限制时从缓存中删除条目:
- Lifespan
- 设置条目可以存在的最长时间。
- 最大闲置
- 指定条目可以保持闲置的时长。如果没有对条目发生操作,则它们就会被闲置。
最大闲置过期目前不支持使用持久性存储的缓存。
如果您将过期和驱除用于 EXCEPTION
驱除策略、已过期但尚未从缓存中删除的条目,则计数为数据容器的大小。
5.4.1. 过期如何工作
当您配置过期时,Data Grid 会使用决定何时过期的元数据存储密钥。
-
lifespan 使用
创建
时间戳和 lifespan配置
属性的值。 -
最大闲置使用
最后一个使用
的时间戳,以及max-idle
配置属性的值。
Data Grid 检查是否设置了 lifespan 或最大空闲元数据,然后将值与当前时间进行比较。
如果 (creation + lifespan < currentTime)
或 (lastUsed + maxIdle < currentTime)
,Data Grid 检测到该条目已过期。
每当访问条目或由过期后找到条目时,就会过期。
例如,k1
达到最大空闲时间,客户端发出 Cache.get (k1)
请求。在这种情况下,Data Grid 检测到条目已过期,并将其从数据容器中删除。Cache.get (k1)
请求返回 null
。
网格也会从缓存存储中过期条目,但只适用于生命周期到期。最大闲置过期不适用于缓存存储。对于缓存加载程序,Data Grid 无法使条目过期,因为加载程序只能从外部存储读取。
Data Grid 将 长
原语数据类型添加到缓存条目的过期元数据。这可增加密钥的大小,其大小为 32 字节。
5.4.2. 过期原因
Data Grid 使用一个定期运行的收款线程来检测和删除过期的条目。过期后期将确保不再访问的过期条目已被删除。
Data Grid ExpirationManager
接口处理 expiration reaper,并公开 processExpiration ()
方法。
在某些情况下,您可以禁用过期时间恢复程序并通过调用 processExpiration ()
来手动过期条目;例如,如果您使用本地缓存模式并定期运行维护线程的自定义应用程序。
如果使用集群缓存模式,则永远不会禁用过期过程。
在使用缓存存储时,网格始终使用过期程序。在这种情况下,您无法禁用它。
5.4.3. 最大闲置和集群缓存
因为最大闲置过期取决于缓存条目的最后访问时间,所以它有一些集群缓存模式的限制。
通过生命周期期限,缓存条目的创建时间提供跨集群缓存的一致性值。例如,所有节点上的 k1
创建时间都相同。
对于使用集群缓存的最大闲置过期,条目的最后访问时间并不始终在所有节点上相同。为确保在集群间都有相同的相对访问时间,当访问密钥时,Data Grid 会将 touch 命令发送到所有所有者。
Data Grid 发送的 touch 命令具有以下注意事项:
-
cache.get ()
请求不会返回,直到所有 touch 命令都完成。此同步行为会增加客户端请求的延迟。 - touch 命令还会更新所有所有者上的缓存条目的"重新访问"元数据,Data Grid 用于驱除。
附加信息
- 最大闲置过期不适用于 invalidation 模式。
- 集群缓存中的迭代可以返回超过最大空闲时间限制的过期条目。此行为可确保性能,因为在迭代过程中不会执行远程调用。另请注意,迭代不会刷新任何过期的条目。
5.4.4. 为缓存配置 lifespan 和最大闲置时间
为缓存中的所有条目设置 lifespan 和最大闲置时间。
流程
- 打开 Data Grid 配置以进行编辑。
-
指定条目可以使用
lifespan
属性或lifespan ()
方法保留在缓存中的时间(以毫秒为单位)。 -
使用
max-idle
属性或maxIdle ()
方法,指定条目在最后一次访问后可以保持闲置的时间(以毫秒为单位)。 - 保存并关闭您的 Data Grid 配置。
Data Grid 缓存过期
在以下示例中,Data Grid 会在最后一次访问时间后 5 秒或 1 秒后过期所有缓存条目,以先发生:
XML
<replicated-cache> <expiration lifespan="5000" max-idle="1000" /> </replicated-cache>
JSON
{ "replicated-cache" : { "expiration" : { "lifespan" : "5000", "max-idle" : "1000" } } }
YAML
replicatedCache: expiration: lifespan: "5000" maxIdle: "1000"
ConfigurationBuilder
ConfigurationBuilder builder = new ConfigurationBuilder(); builder.expiration().lifespan(5000, TimeUnit.MILLISECONDS) .maxIdle(1000, TimeUnit.MILLISECONDS);
5.4.5. 配置每个条目的 lifespan 和最大闲置时间
为单个条目指定 lifespan 和最大闲置时间。当您向条目添加 lifespan 和最大闲置时间时,这些值优先于缓存过期配置。
当您为缓存条目明确定义 lifespan 和最大空闲时间值时,Data Grid 会在集群中复制这些值,以及缓存条目。同样,Data Grid 也会将过期值和条目写入持久性存储。
流程
对于远程缓存,您可以将 lifespan 和最大闲置时间添加到通过 Data Grid 控制台交互的条目。
使用 Data Grid 命令行界面(CLI),通过
put
命令使用--max-idle
参数。=
和--ttl=对于远程和嵌入式缓存,您可以使用
cache.put ()
调用添加 lifespan 和 maximum idle times。//Lifespan of 5 seconds. //Maximum idle time of 1 second. cache.put("hello", "world", 5, TimeUnit.SECONDS, 1, TimeUnit.SECONDS); //Lifespan is disabled with a value of -1. //Maximum idle time of 1 second. cache.put("hello", "world", -1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS);