在EhCache3中,持久缓存是否意味着始终必须将数据写入磁盘缓存?

时间:2019-04-03 10:24:27

标签: java ehcache ehcache-3

在Ehcache 3中,如果我有一个持久性缓存,这是否意味着即使堆/堆缓存已满也将所有内容都写入磁盘缓存中?

即我有这个

PersistentCacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .with(CacheManagerBuilder.persistence(new File(Platform.getPlatformDatabaseFolder(), RELEASE_CACHE)))
                .withCache(RELEASE_CACHE,
                        CacheConfigurationBuilder.newCacheConfigurationBuilder(
                                String.class,
                                String.class,
                                ResourcePoolsBuilder.newResourcePoolsBuilder()
                                        .heap(100, EntryUnit.ENTRIES)
                                        .offheap(10, MemoryUnit.MB)
                                        .disk(20, MemoryUnit.MB, true)))
                .build();

所以我对此感到不满意,但我指定了磁盘缓存,因为通常内存缓存不足,并且我将其指定为持久性的,因为如果将数据写入磁盘,则可能对以后的运行很有用。应用程序。

但是,有时应用程序的使用方式可能不会充分利用堆/堆,因此我不希望应用程序浪费时间将数据写入磁盘只是因为我已将其标记为持久性。毕竟,我使用缓存的原因是为了提高性能。

1 个答案:

答案 0 :(得分:0)

documented一样,每当您在Ehcache中具有多层时,最低层(在您的情况下为磁盘)总会看到put到高速缓存,而更高层则简单地失效(堆放和堆放)您的情况)。在get上,该值被拉入最高层(在您的情况下为堆)以便快速进行后续访问。如果这导致从堆中逐出,则逐出的值将被下推到堆中,并且级联可能导致从堆到磁盘的逐出。

请注意,完成上述系统后,性能可以保持可预测的水平,而不会在层级已满时突然下降。

因此在Ehcache中具有多个层是有代价的。根据您的用例,最好激活较少的分层选项。与缓存一样:测量和调整。