实际上,这意味着持久的内存缓存将启动磁盘上的所有元素。 [...]因此,Ehcache设计在启动时不会将它们全部加载到内存中,而是根据需要懒洋洋地加载它们。
我希望内存缓存启动将其所有元素都存储在内存中,我该如何实现呢?
原因是我们的网站执行批次访问缓存,因此我们第一次访问该网站的响应时间非常短。
答案 0 :(得分:4)
我假设所有缓存的元素都在DiskStore中,并且您希望它们在应用程序启动后立即在内存中。在任何情况下使用BootStrapCacheLoader和BootstrapCacheLoaderFactory应该会有所帮助。
我只想知道在应用程序启动后将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>