从文件系统或磁盘路径读取缓存数据

use*_*226 1 caching ehcache

如果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将从磁盘中检索......

我对么 ?

Lou*_*met 5

答案取决于您的 Ehcache 版本。

从 Ehcache 2.6 开始,存储模型不再是溢出模型而是分层模型。在分层存储模型中,所有数据将始终存在于最低层中。物品将根据它们的热度出现在更高的等级中。

开源 Ehcache 的可能层是:

  • JVM 堆上的堆上
  • 在磁盘上是最低的

根据定义,与较低层相比,高层具有较低的延迟但容量较小。

因此,对于配置了 的缓存overflowToDisk,所有数据将始终位于磁盘层内。它将密钥存储在内存中,并将数据存储在磁盘上。

在缓存中查找条目时,会从最高到最低考虑这些层。在您的示例中,将按如下方式检索数据:

  1. 在内存中搜索
    • 找到了就退货
  2. 在磁盘上搜索
    • 如果找到,则添加到内存层(热数据)并返回。这可能会导致另一个条目从内存中逐出
  3. 使用您的缓存加载器从数据库中检索它
    • 找到后,将其添加到缓存中并返回