第 6 章 配置持久性存储
数据网格使用缓存存储和加载程序与持久性存储交互。
- durability
- 通过添加缓存存储,您可以将数据持久保留到非易失性存储中,因此可以在重启后保留。
- 直写缓存
- 在持久性存储前将 Data Grid 配置为缓存层简化了应用程序的数据访问,因为数据网格处理与外部存储之间的所有交互。
- 数据溢出
- 使用驱除和传递技巧可确保数据网格只保留频繁使用的数据,并将旧的条目写入持久性存储。
6.1. 激ivation
传递将数据网格配置为在从内存中驱除这些条目时将条目写入缓存存储。通过这种方式,传递可确保仅维护某一条目的单一副本、内存中或缓存存储中的单个副本,这样可以防止不必要的且可能代价被写入持久性存储。
当试图访问 passivated 条目时,激活是指从缓存存储中恢复条目的过程。因此,当您启用通过时,您必须配置实施 CacheWriter
和 CacheLoader
接口的缓存存储,以便它们可以从持久性存储中写入和加载条目。
当数据网格从缓存中驱除条目时,它会通知缓存监听程序,该条目通过传递,然后将该条目存储在缓存存储中。当 Data Grid 获取被驱除条目的访问请求时,它会延迟将条目从缓存存储加载到内存中,然后通知条目被激活的缓存监听程序。
- 传递使用 Data Grid 配置中的第一个缓存加载程序并忽略所有其他缓存程序。
不支持使用以下方法:
- 事务型存储。传递写入并从实际数据网格提交边界范围之外的存储中删除条目。
- 共享存储.共享缓存存储需要始终存在于其他所有者的存储中。因此,不支持 passivation,因为无法删除条目。
如果您启用了通过事务存储或共享存储的传递,Data Grid 会抛出异常。
6.1.1. 激ivation 如何工作
禁用传递
写入内存中的数据会导致写入持久性存储。
如果 Data Grid 从内存驱除数据,则持久性存储中的数据包括从内存中驱除的条目。这样,持久性存储是内存缓存的超集。
如果您没有配置驱除,则持久存储中的数据提供了内存中的数据副本。
启用传递
只有当数据从内存中驱除数据时,Data Grid 才会将数据添加到持久性存储中。
当 Data Grid 激活条目时,它会在内存中恢复数据并从持久性存储中删除数据。这样,持久存储形式的内存和数据都是整个数据集的单独子集,在两者之间没有交集。
在使用共享缓存存储时,持久性存储中的条目可能会过时。这是因为,Data Grid 在激活时不会从共享缓存存储中删除 passivated 条目。
值会更新在内存中,但之前传递的条目会停留在带有过期值的持久性存储中。
下表显示了一系列操作后内存和持久性存储中的数据:
操作 | 禁用传递 | 启用传递 | 使用共享缓存存储来传递启用 |
---|---|---|---|
插入 k1。 |
memory: k1 |
memory: k1 |
memory: k1 |
插入 k2。 |
memory: k1, k2 |
memory: k1, k2 |
memory: k1, k2 |
驱除线程运行并驱除 k1。 |
memory: k2 |
memory: k2 |
memory: k2 |
阅读 k1。 |
memory: k1, k2 |
memory: k1, k2 |
memory: k1, k2 |
驱除线程运行并驱除 k2。 |
memory: k1 |
memory: k1 |
memory: k1 |
删除 k2。 |
memory: k1 |
memory: k1 |
memory: k1 |