2.3. 失效缓存
您可以在validation 模式中使用数据网格来优化执行读操作卷的系统。一个好的示例是使用 invalidation 以防止在状态更改时进行大量数据库写入。
只有当您拥有另一个数据库等数据永久存储时,这种缓存模式才有意义,并且仅在读写系统中使用数据网格作为优化,以防止每个读取的数据库出现。如果为无效配置缓存,则每个数据在缓存中都会有变化,集群中的其他缓存都会收到一条信息,告知它们的数据已经过期,并应该从内存中删除,并应该从任何本地存储中删除。
图 2.5. 失效缓存
有时,应用程序会从外部存储中读取值并希望将其写入本地缓存中,而不将其从其他节点中删除。要做到这一点,它必须调用 Cache.putForExternalRead (key, value)
而不是 Cache.put (key, value)
。
Invalidation 模式可以与共享缓存存储一起使用。写入操作都会更新共享存储,它将从其他节点的内存中删除过时的值。这样做的好处是两倍:网络流量尽可能减少,与复制整个值相比,网络流量尽可能小,而且集群中的其他缓存会以极快的方式查找修改的数据,这仅在需要时才会显示修改的数据。
不会在本地、非共享、缓存存储中使用无效模式。invalidation 消息不会删除本地存储中的条目,有些节点会看到过时的值。
也可以使用特殊的缓存加载程序( ClusterLoader
)配置失效的缓存。启用 ClusterLoader
时,读取找不到本地节点上的密钥的操作将首先从所有其他节点请求,并在本地将其保存在内存中。在某些情况下,它将存储陈旧的值,因此只有在对过时值有较高的容错能力时才使用它。
同步或异步复制
同步时,写入块直到集群中的所有节点都被驱除掉过时的值。异步时,原始器会广播无效的消息,但不会等待响应。这意味着,当在原始器上写入完成后,其他节点仍然可以看到过时的值。
Transactions
事务可用于批量无效消息。事务获取主所有者上的密钥锁定。
由于具有保守的锁定,每个写入都会触发锁定信息,该消息被广播到所有节点。在事务提交过程中,originator 广播一个单阶段准备消息(可选 fire-and-forget),它会导致所有受影响的键并释放锁。
通过光驱锁定,原始器将广播准备消息、提交消息和解锁信息(可选)。单阶段准备或解锁信息为 fire-and-forget,最后一条消息会释放锁定。