根据我的理解,这些方法中的每一种:get()
和put()
都是原子的。
但是,在访问ehcache&等缓存时memcached,以CheckThenAct
方式,将出现竞争条件。
我们应该同步什么以确保如果thread1执行Get()
而thread2执行Get()
后跟Put()
,则第一个Get()
将收到新的thread2
{{1}}增值?
答案 0 :(得分:3)
处理这种情况的方法是不要从多个地方缓存写入或以其他方式控制访问。
一个简单的解决方案是不对客户端的缓存进行任何写入。相反,如果您想更新值,则触发请求以更新值。如果从其他地方检索到该值,那么这可以很好地工作。如果计算出来或以其他方式来自客户,则可能会出现问题。
与memcache一起使用的常见组件 - 至少在PHP世界中 - 是beanstalkd作为分布式工作队列处理器。在这种情况下,您可以将“更新缓存”请求作为一个工作单元启动。
如果您正在对使用现有值作为输入的缓存条目执行操作,或者以某种其他方式对get-then-update不是原子操作引入竞争条件,则可以选择创建包含旧值和新值的工作单元。这样,无论处理更新的任何进程都可以使当前值不是预期值的情况无效或以其他方式处理。
增量和减量由memcached接口处理,因此如果您的访问属于该类型(或者可以简化为那种操作),那么也可以解决问题。
答案 1 :(得分:1)
对于memcached,您可以使用cas()操作在执行put()之前检查另一个操作是否还没有更新数据。