13

这个问题是关于NHibernate二级缓存的ReadWrite和NonStrictReadWrite缓存并发策略的区别。

据我了解,当您拥有分布式复制缓存时,这两种策略之间的区别是相关的- nonstrict 不能保证一个缓存具有与另一个缓存完全相同的值,而严格的读/写应该 - 假设缓存提供程序确实适当的分布式锁定。

我不明白的部分是,当您拥有单个缓存或分布式分区(非复制)缓存时,严格与非严格的区别是如何相关的。可以相关吗?在我看来,在非复制场景中,时间戳缓存将确保不提供过时的结果。如果它可能是相关的,我想看一个例子。

4

2 回答 2

19

您的假设是正确的,在单个目标/线程环境中几乎没有区别。但是,如果您查看缓存提供程序,即使在多线程场景中也会发生一些事情。

在非严格的情况下,如何从修改状态重新缓存对象是不同的。例如,如果您的对象需要重新加载,但您希望它在更新后重新加载,而不是让下一个用户支付账单,那么您将看到严格与非严格的不同性能。例如:非严格在执行更新后简单地从缓存中转储一个对象......为下一次访问而不是更新后事件处理程序的获取支付价格。在严格模型中,重新缓存是自动处理的。插入也会发生类似的事情,non-strict 不会在 strict 后面执行任何操作并将新插入的对象加载到缓存中。

在非严格的情况下,您也有可能进行脏读,因为在读取时缓存未锁定,您将看不到另一个线程更改项目的结果。严格来说,该项目的缓存键将锁定,您会被阻止,但会看到绝对最新的结果。

因此,即使在单一目标环境中,如果对对象有大量并发读取/编辑,那么您就有机会看到并不准确的数据。

当执行保存并且正在加载编辑屏幕时,这当然会成为一个问题:认为他们正在编辑对象的最新版本的人实际上不是,当他们尝试保存时会遇到令人讨厌的惊喜对他们加载的过时数据的编辑。

于 2008-09-21T03:43:15.597 回答
2

我在这里创建了一个帖子解释这些差异。请查看并随时发表评论。

于 2012-07-23T07:43:02.320 回答