【问题标题】:NHibernate and Memcached - should use_minimal_puts be enabled?NHibernate 和 Memcached - 应该启用 use_minimal_puts 吗?
【发布时间】:2012-08-20 01:05:14
【问题描述】:

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

根据文档:

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

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

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

【问题讨论】:

  • “以更频繁的读取为代价” - 读取也意味着网络开销,对吧?
  • @PlínioPantaleão - 好点......所以也许一个更好的问题是:写入(很多)比在 memcached 中读取更昂贵?
  • 我没有任何证据支持我的观点,但我不相信这一点。这仅适用于分布式环境,因为写入可能会导致您丢失其他机器上的缓存。如果这在单个机器案例中是真的,我认为他们之前会这样做:)

标签: hibernate nhibernate caching memcached second-level-cache


【解决方案1】:

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

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

当从缓存读取的数据比数据更新成本低得多时,这将很有帮助。这就是文档对以下内容的含义

...优化二级缓存操作以最小化写入,在 更频繁读取的成本。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    只是添加更多细节。

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-09-29
      • 2011-08-08
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多