如果overflowToDisk 启用并Disk path配置,那么如果在内存中找不到数据,它是否应该自动从diskpath?
参考提到的配置
当 overFlowToDisk 在 EHCACHE 中被激活时?
我的情况
1) 在应用程序启动之前从数据库预热缓存
2) 使用加载器实现从 DB 加载数据
3) 最初 DB 有 2000 条数据。所以我们在内存中有 1000 个 (ABC_007),其余 1000 个在磁盘中。
这样对吗?
<cache name="ABC_007"
maxElementsInMemory="1000"
maxElementsOnDisk="10000"
overflowToDisk="true"
timeToIdleSeconds="..."
timeToLiveSeconds="...">
</cache>
Run Code Online (Sandbox Code Playgroud)
如果我搜索不在 中的数据ABC_007,它将从 DISKPATH 中检索。我是对的吗?
现在,如果我实现缓存读取功能,即如果数据在缓存中不可用(包括磁盘路径),我应该在数据库中搜索。
现在我找到了数据。它会重新填充缓存吗?
如果 ABC_007 仍然包含 1000 个元素。它将存储在哪里?ABC_007或磁盘?
请纠正我的理解。
例如参考示例代码
Cache cache = manager.getCache("ABC_007");
Element element = null;
String key = null;
for (int i=0 ; i<2000 ; i++) {
key = "keyInCache" + i ;
element = new Element (key , "value1");
cache.put(element);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我超过 1000 时,根据配置,1001 到 2000 个元素将存储在磁盘中。
<cache name="ABC_007"
maxElementsInMemory="1000"
maxElementsOnDisk="10000"
overflowToDisk="true"
timeToIdleSeconds="..."
timeToLiveSeconds="...">
Run Code Online (Sandbox Code Playgroud)
现在我想要的价值
Key = keyInCache1700
element = cache.get(key);
Run Code Online (Sandbox Code Playgroud)
从哪里我会得到价值?
我的理解 - 因为ABC_007 cache has maxElementsInMemory="1000",这意味着它可以在内存中存储多达 1000 个键值,并且键的值keyInCache1700将从磁盘中检索......
我对么 ?
答案取决于您的 Ehcache 版本。
从 Ehcache 2.6 开始,存储模型不再是溢出模型而是分层模型。在分层存储模型中,所有数据将始终存在于最低层中。物品将根据它们的热度出现在更高的等级中。
开源 Ehcache 的可能层是:
根据定义,与较低层相比,高层具有较低的延迟但容量较小。
因此,对于配置了 的缓存overflowToDisk,所有数据将始终位于磁盘层内。它将密钥存储在内存中,并将数据存储在磁盘上。
在缓存中查找条目时,会从最高到最低考虑这些层。在您的示例中,将按如下方式检索数据:
| 归档时间: |
|
| 查看次数: |
3900 次 |
| 最近记录: |