Load EhCache diskstore content into memory

2020-07-08 07:59发布

问题:

As said in EhCache documentation:

In practice this means that persistent in-memory cache will start up with all of its elements on disk. [...] So, the Ehcache design does not load them all into memory on start up, but lazily loads them as required.

I would like that the memory cache start up will all its elements in memory, how can I achieve that?

The reason for this is that our website performs a lot of access to the cache, so the first time we visit the website it has very bad response time.

回答1:

I am assuming that all the cached elements are in the DiskStore and you want them to be in-memory as soon as the application is started. In anycase using BootStrapCacheLoader and BootstrapCacheLoaderFactory should be helpful.

I am just giving idea where we load DiskStore into memeory after the application is started

You can implement BootstrapCacheLoader which will load the cache elements as below. Definition of the method BootstrapCacheLoader.load(Ehcache cache) can be

       //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);
        }

Above method reads the element from DiskCache, Removes it and Puts it back so that it stays in the memory and disk version is removed.

Implement BootstrapCacheLoaderFactory so that

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

    return loader;
}
.
.
}

You can define cache configuration as below with CustomBootstrapCacheLoaderFactory as below

<cache
         name="DummyCacheEl"
         maxElementsInMemory="3500"
         eternal="true"
         overflowToDisk="false"
         diskPersistent="true"
         memoryStoreEvictionPolicy="LRU">
         <bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory"  properties="async=true"/>
</cache>