我将NHibernate与Memcached一起用作二级缓存,并一直对cache.use_minimal_puts
配置选项感到好奇。
根据文件:
hibernate.cache.use_minimal_puts:优化二级缓存操作以最小化写入,但代价是 更频繁的阅读。此设置对群集最有用 默认情况下,为群集缓存启用缓存和Hibernate3 的实施方式。
要清楚,我没有在集群环境中运行Memcached,但它确实在远程计算机上运行。另一个需要考虑的因素可能是读取和写入Memcached之间的速度是否存在任何重大差异。
在这种情况下,我可以从启用cache.use_minimal_puts
中受益吗?
答案 0 :(得分:16)
我没有NHibernate的经验,但是在Hibernate中使用过二级缓存,我被告知相同的概念适用于两者。
提供参数 hibernate.cache.use_背后的基本思路 minimal_puts 是在hibernate将一个对象放入缓存之前,首先检查二级缓存是否该对象已经存在,如果没有那么只放在那里。
当从缓存中读取的数据比数据更新便宜得多时,这将非常有用 ONLY 。这就是文档对以下内容的意义
...优化二级缓存操作以最小化写入,at 更频繁阅读的费用。
适合此类优化的情况是群集中的复制。
如果您正在使用群集,则put操作非常昂贵,因为它会在群集缓存的情况下激活缓存复制侦听器。如果你没有使用群集,那么这个put操作相对来说非常便宜。
即使在群集的情况下,也可能存在依赖于实体失效而不是复制对它们所做的更改的缓存提供者。在这种情况下,这个参数也没用。
可能妨碍性能的一个因素是Memcache使用的同步或异步复制。我没有使用过MemCache,但EhCache支持这两种模式。
因此,在您的情况下,因为您不使用群集,虽然缓存位于远程进程上,但我非常怀疑通过将此参数设置为true可以获得任何性能优势。
答案 1 :(得分:0)
只是添加更多细节。
hibernate.cache.use_minimal_puts
,将此值设置为true
将阻止它盲目地覆盖以前缓存的值,从而解决群集缓存问题。根据手册,默认情况下它为群集缓存实现启用。
Hibernate
提供配置属性hibernate.cache.use_minimal_puts
,它通过增加缓存读取和减少缓存更新来优化群集缓存的缓存访问。
CacheMode.REFRESH
将绕过hibernate.cache.use_minimal_puts
效果