13

我使用 NHibernate 和 Memcached 作为二级缓存,并且一直对cache.use_minimal_puts配置选项感到好奇。

根据文档:

hibernate.cache.use_minimal_puts:优化二级缓存操作以最小化写入,代价是更频繁的读取。此设置对集群缓存最有用,并且在 Hibernate3 中,默认为集群缓存实现启用。

需要明确的是,我没有在集群环境中运行 Memcached,但它确实在远程机器上运行。另一个需要考虑的因素可能是读取和写入 Memcached 的速度是否存在重大差异。

cache.use_minimal_puts在这种情况下我会从启用中受益吗?

4

2 回答 2

17

我在 NHibernate 方面没有经验,但在 Hibernate 中使用过二级缓存,我被告知相同的概念适用于两者。

提供参数hibernate.cache.use_minimal_puts背后的基本思想是,在 hibernate 将对象放入缓存之前,它首先检查二级缓存是否已经存在该对象,如果不存在则只放在那里。

当从缓存读取的数据比数据更新便宜得多时,这才有用。这就是文档对以下内容的含义

...优化二级缓存操作以最小化写入,但以更频繁的读取为代价。

非常适合这种优化的情况是集群中的复制。

如果您使用集群,则 put 操作非常昂贵,因为它会在集群缓存的情况下激活缓存复制侦听器。如果你不使用集群,那么这个 put 操作相对来说非常便宜。

即使在集群的情况下,也可能存在依赖于实体失效而不是复制对它们所做的更改的缓存提供程序。在那种情况下,这个参数也是没用的。

影响性能的一个因素是 Memcache 使用的复制类型(同步或异步)。我没有使用过 MemCache,但 EhCache 支持这两种模型。

因此,在您的情况下,由于您没有使用集群并且虽然缓存位于远程进程上,但我严重怀疑将此参数设置为 true 是否会带来任何性能优势。

于 2012-09-12T13:29:06.523 回答
0

只是为了添加更多细节。

hibernate.cache.use_minimal_puts, 设置这个值true可以防止它盲目的覆盖之前缓存的值,从而解决了集群缓存的问题。根据手册,它默认启用集群缓存实现。

Hibernate提供配置属性hibernate.cache.use_minimal_puts,通过增加缓存读取和减少缓存更新来优化集群缓存的缓存访问。

CacheMode.REFRESH会绕过hibernate.cache.use_minimal_puts效果

于 2014-09-02T17:11:19.877 回答