1

我在我的项目中将 Ehcache 设置为 Hibernate 的二级缓存。所有对象都将通过 Hibernate 进行更新,并具有 CacheConcurrencyStrategy.READ_WRITE 的缓存策略。在我看来,缓存中不应该有过时的数据,因为如果发生更新,该对象将从缓存中删除。在应用程序之外不会发生对数据库的更新。

我的问题是,在定义缓存时,将永恒属性设置为 true 是否有意义。我想不出对象应该从缓存中过期的任何原因,因此倾向于将永恒设置为真。我是否误解了 Ehcache 的行为方式?

4

1 回答 1

2

我认为这取决于几件事。

你的实体有多“长寿”?如果您处理永远不会删除的实体,它们将永远存在于您的缓存中,占用内存。如果它们只被处理一次——与频繁访问相比,这是没有意义的。

你的缓存有多大?它们是否溢出到磁盘?您使用哪种内存驱逐策略?
我假设您限制了缓存大小,因此将更多元素放入缓存中会导致驱逐发生,因此您需要考虑适当的驱逐策略;因为这里的错误选择可能会导致缓存未命中,否则可以避免。它还可能导致您最想避免的磁盘 I/O(取决于您的配置)。

作为积极的指标,您可以使用永久缓存

  • 如果要缓存的对象数量相对较少并且不会超过缓存大小
  • 您定期(例如每天)定期重新启动您的应用程序(并清除缓存),这样缓存大小无论如何都不会受到影响
  • 如果经常访问相同的对象,因此您可以有意义地使用 LRU 或 LFU 驱逐策略

请注意,这些或多或少是经验法则;具体情况可能需要具体评估;)

于 2013-04-10T15:13:32.193 回答