0

使用 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();

所以我正在使用这个但我已经指定了一个磁盘缓存,因为通常内存缓存是不够的,我已经指定它是持久的,因为如果数据被写入磁盘,它可能对应用程序的后续运行很有用。

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

4

1 回答 1

0

文档所述,每当您在 Ehcache 中有多个层时,最低层(在您的情况下为磁盘)总是会看到put缓存,而较高的层只是无效(在您的情况下为堆外和堆)。在 aget上,该值被拉入最高层(在您的情况下为堆)以进行快速后续访问。如果这导致从堆中逐出,则被逐出的值被下推到堆外,并且在级联中,这可能导致从堆外到磁盘的逐出。

请注意,上述系统已完成,以便性能保持可预测,而不是在层满时突然下降。

因此,在 Ehcache 中有多个层是有成本的。根据您的用例,激活较少的分层选项可能会更好。与缓存一样:衡量和适应。

于 2019-04-15T08:34:18.550 回答