当前位置: 首页 > 知识库问答 >
问题:

将 EhCache 磁盘存储内容加载到内存中

淳于禄
2023-03-14

如EhCache留档所述:

实际上,这意味着持久性内存中缓存将启动,其所有元素都将在磁盘上。[...]因此,Ehcache设计不会在启动时将它们全部加载到内存中,而是根据需要懒惰地加载它们。

我希望内存缓存启动时将所有元素都存储在内存中,我该如何实现?

这是因为我们的网站对缓存执行了大量的访问,所以我们第一次访问网站时,它的响应时间非常长。

共有1个答案

公西国发
2023-03-14

我假设所有缓存的元素都在DiskStore中,您希望应用程序一启动,它们就在内存中。在任何情况下,使用BootStrapCacheLoader和Bootstrap CacheLoaderFactory都会有所帮助。

我只是给出了在应用程序启动后将DiskStore加载到内存中的想法

您可以实现BootstrapCacheLoader,它将加载缓存元素,如下所示。可以定义方法BootstrapCacheLoader.load(Ehcache缓存)

       //CustomBootstrapCacheLoader implements BootstrapCacheLoader


        List<?> keys = cache.getKeys();

        if ((keys == null) || keys.isEmpty())
        {
            return;
        }

        for (Object key : keys)
        {
           Element el = cache.getQuiet(key);
           cache.removeQuiet(key);
           cache.putQuiet(el);
        }

上述方法从DiskCache中读取元素,将其删除并将其放回原处,以便将其保留在内存中并删除磁盘版本。

实现BootstrapCacheLoaderFactory,以便

public class CustomBootstrapCacheLoaderFactory extends BootstrapCacheLoaderFactor
{
.
.
@Override
public BootstrapCacheLoader createBootstrapCacheLoader(Properties properties)
{
    CustomBootstrapCacheLoader loader = new CustomBootstrapCacheLoader();
    loader.setAsynchronous(getAsyncFromProperty(properties));

    return loader;
}
.
.
}

您可以使用CustomBootstrapCacheLoaderFactory定义缓存配置,如下所示

<cache
         name="DummyCacheEl"
         maxElementsInMemory="3500"
         eternal="true"
         overflowToDisk="false"
         diskPersistent="true"
         memoryStoreEvictionPolicy="LRU">
         <bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory"  properties="async=true"/>
</cache>  
 类似资料:
  • 问题内容: 我有一个长度为2.2亿(固定)的int和float数组。现在,我想将这些阵列存储到内存和磁盘/从内存和磁盘上载。目前,我正在使用Java NIO的FileChannel和MappedByteBuffer解决此问题。它可以正常工作,但大约需要5秒钟(Wall Clock Time)(用于将阵列存储到内存或从内存上载到磁盘或从磁盘上载到磁盘)。实际上,我想要一个更快的。有人可以帮我吗,有没

  • 我想结合内存和磁盘缓存使用EhCache。当内存已满时,EhCache应将新元素移动到磁盘。e、 g.我在ehCache内存存储中有100个元素,并尝试放入第101个元素,如果内存已满,则将第101个单元放入磁盘,而不是第一个单元。 你能让我知道实现这一点的缓存配置吗?

  • 问题内容: 我正在使用具有磁盘存储持久性的缓存。在随后重新运行该应用程序时,出现以下错误: 除了在应用程序中的某个位置显式调用之外,还有什么方法可以解决此问题? 缓存配置: 复制问题的代码: 问题答案: 尝试设置系统属性: net.sf.ehcache.enableShutdownHook = true 因此,您可以在程序的开头添加以下行: 或者,从命令行传递属性: 注意,ehcache网站在使用

  • 在服务器重置缓存数据保存在磁盘存储后。但在服务器启动后不使用缓存数据。所以我想加载磁盘存储内容到memory.How做到这一点?在这个堆栈问题加载EhCache磁盘存储内容到内存中使用BootstrapCacheLoaderFactory但不为我出现。

  • 我们在应用程序中使用ehcache。请看以下配置: 既然我们已经配置为eternal="true ",那么它会永远创建缓存吗?。磁盘空间有可能用完吗? 对磁盘存储的性能会有什么影响?。肯定比内存缓存慢,但是影响有多大。 如果磁盘中存储了更多缓存,是否会导致执行多个文件操作的IO问题? 请建议生产级应用的最佳实践。假设我们有一个3 GB的堆内存和25000个并发用户访问应用程序。但是,我们的应用程序

  • 细节 Linux 中,设备用/dev/目录下的文件表示。例如 /dev/hda1 第一块硬盘的第一主分区 /dev/hdb5 第二块硬盘的第一逻辑分区 /dev/sda4 第一块 SATA 硬盘的第四主分区,或者扩展分区 /dev/null 黑洞设备 关于磁盘设备,详见“分区概念”一节 mount 设备文件 [挂载路径] 挂载文件系统 -t 指定文件系统的类型 通常不必指定,mount 自