据我了解,这些方法中的每一个:get()
和 put()
是原子的。
但是,当访问像 ehcache 和 memcached 这样的缓存时,在 CheckThenAct
中时尚,竞争条件将会出现。
如果 thread1 执行 Get()
,我们应该同步什么来确保thread2 做了一个 Get()
其次是 Put()
,第一个 Get()
将收到 thread2
增加的新值?
最佳答案
处理这种情况的方法是不缓存来自多个地方的写入或以其他方式控制访问。
一个简单的解决方案是不要从您的客户端对缓存进行任何写入。相反,如果您想更新值,您会发出更新值的请求。如果该值是从其他地方检索到的,那么这可以很好地工作。如果它是计算出来的或以其他方式来自客户端,那么它可能会有更多问题。
与 memcache 一起使用的一个常见组件(至少在 PHP 世界中)是 beanstalkd 作为分布式工作队列处理器。在这种情况下,您可以将“更新缓存”请求作为一个工作单元触发。
如果您正在对使用现有值作为输入的缓存条目进行操作,或者如果 get-then-update 不是原子操作,则以某种其他方式引入竞争条件,另一种方法是创建一个包括旧值和新值的工作单元。这样,任何处理更新的进程都可以使当前值不是预期值的情况无效或以其他方式处理这些情况。
递增和递减由 memcached 接口(interface)处理,因此如果您的访问属于那种类型(或者可以减少为那种操作),那么这也可以解决问题。
关于java - 如何同步访问 ehcache、memcached 和其他键值存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1436483/