Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 从文件系统或diskpath读取缓存数据_Caching_Ehcache - Fatal编程技术网

Caching 从文件系统或diskpath读取缓存数据

Caching 从文件系统或diskpath读取缓存数据,caching,ehcache,Caching,Ehcache,如果启用了overflowToDisk并配置了磁盘路径,那么如果在内存中找不到数据,它是否应该从diskpath自动搜索 参考上述配置 我的案子 1应用程序启动前从数据库进行缓存预热 2使用加载器实现从数据库加载数据 3最初数据库有2000个数据。所以我们在内存中有1000个ABC_007,在磁盘中有1000个 这是正确的吗 <cache name="ABC_007" maxElementsInMemory="1000" maxElements

如果启用了overflowToDisk并配置了磁盘路径,那么如果在内存中找不到数据,它是否应该从diskpath自动搜索

参考上述配置

我的案子

1应用程序启动前从数据库进行缓存预热

2使用加载器实现从数据库加载数据

3最初数据库有2000个数据。所以我们在内存中有1000个ABC_007,在磁盘中有1000个

这是正确的吗

 <cache name="ABC_007"
           maxElementsInMemory="1000"
           maxElementsOnDisk="10000"
           overflowToDisk="true"
           timeToIdleSeconds="..."
           timeToLiveSeconds="...">
    </cache>
现在,当我跨越1000,然后根据配置,1001到2000个元素将存储在磁盘中

 <cache name="ABC_007"
           maxElementsInMemory="1000"
           maxElementsOnDisk="10000"
           overflowToDisk="true"
           timeToIdleSeconds="..."
           timeToLiveSeconds="...">
从何处获得价值

我的理解-由于ABC_007缓存的maxElementsInMemory=1000,这意味着它可以在内存中存储多达1000个键值,并且将从磁盘中检索键值Incache1700


我说得对吗

我只想概述/总结一下我对EHCache工作原理的大致想法:

它本质上是一个HashMap。 它始终将密钥的哈希映射保存在内存中。 项目的实际内容可以存储在内存中,也可以在有足够的项目溢出到磁盘时存储。 结论:我的理解是EHCache知道它缓存了哪些密钥,以及这些项当前存储在哪里。这是缓存快速检索项目的基本必要条件

如果EHCache不知道某个项目,我不希望它在磁盘上查找它


围绕缓存的使用,您肯定应该实现从读到DB的逻辑。显然,必须从数据库中读取缓存中未找到的项。在那个时候将它们添加到缓存中可以将它们存储在内存中,因为它们最近非常流行。

我将概述/总结一下我对EHCache工作原理的大致想法:

它本质上是一个HashMap。 它始终将密钥的哈希映射保存在内存中。 项目的实际内容可以存储在内存中,也可以在有足够的项目溢出到磁盘时存储。 结论:我的理解是EHCache知道它缓存了哪些密钥,以及这些项当前存储在哪里。这是缓存快速检索项目的基本必要条件

如果EHCache不知道某个项目,我不希望它在磁盘上查找它


围绕缓存的使用,您肯定应该实现从读到DB的逻辑。显然,必须从数据库中读取缓存中未找到的项。在那个时候将它们添加到缓存会将它们放在内存中,因为它们目前正被热使用。

答案取决于您的Ehcache版本

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

开源Ehcache的可能层包括:

在JVM堆上的堆上 在磁盘上,哪个是最低的 根据定义,高层的延迟较低,但容量较低

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

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

在内存中搜索 如果找到,请退回 在磁盘上搜索 如果找到,将热数据添加到内存层并返回。这可能会导致从内存中逐出另一个条目 使用缓存加载程序从数据库中检索它 找到后,将其添加到缓存并返回
答案取决于您的Ehcache版本

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

开源Ehcache的可能层包括:

在JVM堆上的堆上 在磁盘上,哪个是最低的 根据定义,高层的延迟较低,但容量较低

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

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

在内存中搜索 如果找到,请退回 在磁盘上搜索 如果找到,将热数据添加到内存层并返回。这可能会导致从内存中逐出另一个条目 使用缓存加载程序从数据库中检索它 找到后,将其添加到缓存并返回
 <cache name="ABC_007"
           maxElementsInMemory="1000"
           maxElementsOnDisk="10000"
           overflowToDisk="true"
           timeToIdleSeconds="..."
           timeToLiveSeconds="...">
Key = keyInCache1700

element = cache.get(key);