Java 将EhCache diskstore内容加载到内存中
如中所述: 实际上,这意味着永久内存缓存将启动,其所有元素都在磁盘上。[…]因此,Ehcache设计不会在启动时将它们全部加载到内存中,而是根据需要延迟加载它们 我希望内存缓存启动时将其所有元素都存储在内存中,我如何才能实现这一点Java 将EhCache diskstore内容加载到内存中,java,caching,ehcache,memorycache,Java,Caching,Ehcache,Memorycache,如中所述: 实际上,这意味着永久内存缓存将启动,其所有元素都在磁盘上。[…]因此,Ehcache设计不会在启动时将它们全部加载到内存中,而是根据需要延迟加载它们 我希望内存缓存启动时将其所有元素都存储在内存中,我如何才能实现这一点 原因是我们的网站对缓存进行了大量访问,因此我们第一次访问网站时,它的响应时间非常差。我假设所有缓存的元素都在DiskStore中,并且您希望在应用程序启动后立即将它们存储在内存中。在任何情况下,使用BootStrapCacheLoader和BootstrapCache
原因是我们的网站对缓存进行了大量访问,因此我们第一次访问网站时,它的响应时间非常差。我假设所有缓存的元素都在DiskStore中,并且您希望在应用程序启动后立即将它们存储在内存中。在任何情况下,使用BootStrapCacheLoader和BootstrapCacheLoaderFactory都会有所帮助 我只是想知道在应用程序启动后,我们在哪里将DiskStore加载到Memory中 您可以实现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);
}
您可以使用CustomBootstrapCacheLoaderFactory如下定义缓存配置
<cache
name="DummyCacheEl"
maxElementsInMemory="3500"
eternal="true"
overflowToDisk="false"
diskPersistent="true"
memoryStoreEvictionPolicy="LRU">
<bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory" properties="async=true"/>
</cache>
你能在启动时遍历所有条目吗?我目前就是这么做的,但它的运行速度非常慢(我在循环中调用高级方法,这些高级方法也会发出DB请求)。如果有一种方法可以直接使用EhCache API在所有条目上进行迭代,那么对于BootstrapCacheLoader来说,这可能是一种好方法。代码中关于从磁盘删除并将其加载到内存中的一个小建议,Element el=cache.removeAndReturnElement(key);我建议使用这种方法,而不是先执行get,然后删除元素。True,但它会通知CacheEventListener。在引导缓存时可能不需要。是的,因此如果没有为该缓存配置通知程序,则这将有助于提高性能。是的。此外,我们必须异步加载缓存(在loadcache方法中生成一个线程),以便它现在阻止实例启动删除它并将其放回内存中,从而删除磁盘版本。
我不想从磁盘缓存中删除元素?我只想把它们载入内存。
<cache
name="DummyCacheEl"
maxElementsInMemory="3500"
eternal="true"
overflowToDisk="false"
diskPersistent="true"
memoryStoreEvictionPolicy="LRU">
<bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory" properties="async=true"/>
</cache>