【问题标题】:In EhCache3 does a persistent cache mean that data always has to be written to the disk cache在 EhCache3 中,持久缓存是否意味着数据始终必须写入磁盘缓存
【发布时间】:2019-08-24 20:20:19
【问题描述】:

使用 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 cpu 机器上运行,所以如果操作系统必须做额外的事情会减慢速度,所以澄清一下它会将所有内容写入磁盘?
  • 我不是这方面的专家,但也许只有 1 个 cpu,写入磁盘的高 I/O 负载会长时间阻塞您的线程。可能很难解决..

标签: java ehcache ehcache-3


【解决方案1】:

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

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

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

【讨论】:

  • 好吧,我总是需要最低层,因为这个想法是在控制内存使用的同时提高性能,所以如果我没有磁盘持久性,那么我只能存储有限数量的项目。但是如果我没有堆持久性,那么总是会从磁盘读取缓存,所以会很慢。我以前使用的是 Hibernate,但由于对象不会改变,我想摆脱包括锁定机制在内的完整数据库管理的开销。
  • 但也许同时拥有堆和非堆没什么意义
猜你喜欢
  • 2016-02-26
  • 2016-08-23
  • 2012-08-19
  • 2010-09-15
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多