根据我的理解,这些方法中的每一个: get() put()都是原子的。

但是,在访问ehcache&等缓存时memcached,以 CheckThenAct 方式,将出现竞争条件。

我们应该同步以确保如果thread1执行 Get()并且thread2执行 Get()后跟 Put(),第一个 Get()将收到 thread2 添加的新值?

有帮助吗?

解决方案

处理这种情况的方法是不要从多个地方缓存写入或以其他方式控制访问。

一个简单的解决方案是不对客户端的缓存进行任何写入。相反,如果您想更新值,则触发请求以更新值。如果从其他地方检索到该值,那么这可以很好地工作。如果计算出来或以其他方式来自客户,则可能会出现问题。

与memcache一起使用的常见组件 - 至少在PHP世界中 - 是beanstalkd作为分布式工作队列处理器。在这种情况下,您可以启动“更新缓存”。要求作为一个工作单位。

如果您正在对使用现有值作为输入的缓存条目执行操作,或者以某种其他方式对get-then-update不是原子操作引入竞争条件,则可以选择创建包含旧值和新值的工作单元。这样,无论处理更新的任何进程都可以使当前值不是预期值的情况无效或以其他方式处理。

增量和减量由memcached接口处理,因此如果您的访问属于该类型(或者可以简化为那种操作),那么也可以解决问题。

其他提示

对于memcached,您可以使用cas()操作在执行put()之前检查另一个操作是否还没有更新数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top