第 3 章 集群缓存
集群缓存使用 JGroups 技术作为传输层将数据在整个网络间存储数据。
3.1. Invalidation 模式
您可以使用 Data Grid invalidation 模式来优化执行大量读操作的系统。一个很好的例子是使用失效的,以防止在状态更改时进行大量数据库写入。
只有在为数据库(如数据库)具有另一个永久存储,且仅在读密集型系统中优化时,此缓存模式才有意义,以防止每次读取时达到数据库。如果缓存被配置为无效,则每次数据在缓存中都会更改,集群中的其他缓存都会收到一条信息通知它们的数据现在过时,应该从内存和任何本地存储中删除。
图 3.1. Invalidation 模式
有时,应用程序会从外部存储读取值,并希望将其写入本地缓存,而无需将其从其他节点中删除。要做到这一点,它必须调用 Cache.putForExternalRead (key, value)
而不是 Cache.put (key, value)
。
Invalidation 模式可用于共享缓存存储。写入操作同时更新共享存储,它会从其他节点的内存中删除过时的值。这样做的好处是两倍:与复制整个值相比,网络流量被最小化,因为与复制整个值相比,网络流量会很小,集群中的其他缓存也会以 lazy 方式查找修改的数据,只在需要时才需要。
切勿将 invalidation 模式用于 本地存储。Invalidation 消息不会删除本地存储中的条目,有些节点将保持过时的值。
也可以使用特殊的缓存加载程序 ClusterLoader
配置无效的缓存缓存。启用 ClusterLoader
时,找不到本地节点上密钥的读取操作将首先从所有其他节点请求它,并将它存储在本地内存中。在某些情况下,它将存储过时的值,因此只有在对过时的值具有高容错能力时才使用它。
invalidation 模式可以是同步或异步模式。同步时,写入块直到集群中的所有节点都被驱除。异步时,原始器广播消息,但不会等待响应。这意味着其他节点仍然会在原始器上完成写入后看到过时的值。
事务可用于批量处理无效消息。事务在主所有者上获取密钥锁定。要了解有关如何分配主要所有者的更多信息,请阅读 主要所有者部分。
- 使用 pessimistic 锁定时,每个写入都会触发锁定消息,该消息广播到所有节点。在事务提交过程中,原始器会广播一阶段准备消息(可选)使所有受影响的密钥无效,并释放锁定。
- 使用最佳锁定时,原始器会广播准备消息、提交消息和解锁消息(可选)。一个阶段准备或解锁消息是 fire-and-forget,最后一个消息始终释放锁定。