第 3 章 缓存接口
Data Grid 提供了一个 缓存 接口,它公开了添加、检索和删除条目的简单方法,包括 JDK 的 ConcurrentMap 接口公开的原子机制。根据所使用的缓存模式,调用这些方法会触发很多事情,甚至可能包括将条目复制到远程节点或从远程节点中查找条目或可能缓存存储。
3.1. Cache API
对于简单用途,使用 Cache API 不应与使用 JDK Map API 不同,因此应该根据映射到数据中心的缓存从简单内存缓存迁移。
3.1.1. Certain Map 方法的性能确定
在映射中公开的某些方法在与 Data Grid 一起使用时有一些性能结果,如 size ()、values ()、keySet () 和 entrySet ()。有关 keySet
、值和
entrySet
的具体方法可以明确使用,请参阅其 Javadoc 了解更多详情。
尝试全局执行这些操作会对性能有较大的影响,并成为可扩展性瓶颈。因此,这些方法只用于信息或调试目的。
请注意,将某些标记与 withFlags () 方法一起使用可以缓解其中一些问题,请查看每种方法的文档以获取更多详细信息。
3.1.2. Mortal 和 Immortal 数据
此外,要存储条目,Data Grid 的缓存 API 允许您将大量信息附加到数据。例如,只是使用 put (键、值) 会创建一个 immortal 条目,即永久在缓存中处于活动状态的条目,直到它被删除(或从内存中驱除以防止内存不足)。但是,如果您使用 put (key, value, Lifespan, timeunit)将数据 放在缓存中,这会创建一个 mortal 条目,即有固定生命周期的条目,并在其生命周期之后过期。
除了 Life span 外,Data Grid 还支持 maxIdle 作为决定过期的额外指标。可以使用 lifetimespans 或 maxIdles 的任意组合。
3.1.3. putForExternalRead 操作
数据中心的 缓存 类包含不同的"吞吐量"操作,称为 putForExternalRead。当 Data Grid 用作其他位置数据的临时缓存时,此操作特别有用。在大量读取场景中,缓存中的竞争不应延迟手动实际事务,因为缓存应只是优化,而不是以某种方式获得的情况。
为达到此目的,placementForExternalRead
() 充当仅在缓存中没有密钥时运行的放置调用,如果另一个线程尝试同时存储同一密钥,则会失败。在这个特定场景中,缓存数据是一种选择系统的方法,因此不需要缓存中的故障会影响正在进行的事务,因此导致处理失败的原因不同。putForExternalRead ()
被视为快速操作,因为无论它是成功还是不等待任何锁定,因此都无法立即返回到调用者。
要了解如何使用此操作,请查阅基本示例。假设您是 Person 实例的缓存,每个由 PersonId 的键,其数据都源自在单独的数据存储中。以下代码显示了在本示例上下文中使用 putForExternalRead 的最常见模式:
// Id of the person to look up, provided by the application PersonId id = ...; // Get a reference to the cache where person instances will be stored Cache<PersonId, Person> cache = ...; // First, check whether the cache contains the person instance // associated with with the given id Person cachedPerson = cache.get(id); if (cachedPerson == null) { // The person is not cached yet, so query the data store with the id Person person = dataStore.lookup(id); // Cache the person along with the id so that future requests can // retrieve it from memory rather than going to the data store cache.putForExternalRead(id, person); } else { // The person was found in the cache, so return it to the application return cachedPerson; }
请注意,PutForExternalRead 不应用作使用新 Person 实例更新缓存的机制,它们源自应用程序执行(例如,修改 Person 地址的事务)。更新缓存的值时,请使用标准 put 操作,否则可能会出现缓存损坏数据的可能性。