2012-08-24 26 views
12

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

根据文档:

hibernate.cache.use_minimal_puts的:优化第二级缓存操作,以尽量减少写操作,而成本更频繁的读取 。此设置对集群 缓存最为有用,并且在Hibernate3中,对于集群缓存 实现默认启用。

要清楚,我没有在群集环境中运行Memcached,但它确实在远程计算机上运行。另一个需要考虑的因素可能是Memcached的读写速度是否有很大差异。

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

+0

“更频繁读取的成本” - 也读了网络开销意味着,对不对? –

+0

@PlínioPantaleão - 好点..也许更好的问题是:写入(很多)比在memcached读取更昂贵? – DanP

+0

我没有任何证据支持我的意见,但我不相信这一点。这仅在分布式环境中才是正确的,因为写入可能会导致您在其他机器上丢失缓存。如果在单机情况下这是真的,我认为他们会做到这一点:) –

回答

15

我没有NHibernate的经验,但曾在Hibernate的二级缓存中工作,并且我被告知相同的概念适用于两者。

后面提供参数hibernate.cache.use_ minimal_puts的基本思路是,把休眠状态中的对象缓存之前,它首先检查二级缓存的对象是否已经存在在那里,如果没有的话只能放那里。

这将是有益的只有当数据从缓存读取比数据更新更便宜。这是文档的意思大约二级缓存以下工作

...优化,以最小化写在 更频繁读取的成本。

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

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

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

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

因此,在你的情况下,你是不是使用集群,虽然缓存是在一个远程过程,我严重怀疑,将此参数设置为true会有任何性能优势。

0

只需添加更多的细节。

hibernate.cache.use_minimal_puts,将此值设置为true将防止它盲目地覆盖先前缓存的值,从而解决集群缓存问题。根据手册,默认情况下启用群集缓存实现。

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

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