在memcache中执行原子数组修改

时间:2010-07-21 14:13:21

标签: multithreading language-agnostic memcached

假设您要在memcache中保留您网站的最后10位访问者列表。

每当有人访问您的网站时,您都希望将它们推送到数组并移出阵列中的第一个访问者。

当然,一个潜在的问题是多个访问者可能会同时覆盖和读取此数组,可能会相互绊倒。当然,memcache中没有原子推送/转换。

可能存在两种近同时用户访问的不一致情况:

  1. 用户A从memcache获取数组
  2. 用户B从memcache获取数组
  3. 用户A修改数组(更改将丢失)
  4. 用户B修改数组
  5. 用户A将数组存储在memcache
  6. 用户B将数组存储在memcache 中(将覆盖步骤3中的A更改)
  7. 如何使用memcache正确完成这样的事情?

2 个答案:

答案 0 :(得分:1)

使用CAS令牌。请参阅:http://github.com/memcached/memcached/blob/master/doc/protocol.txt例如,参见PHP实施。这可能取决于“失败”流程的工作,即获取新数据并确定如何修改获胜流程。

答案 1 :(得分:0)

我们为此建立了CAS。

  1. 用户A获取数组
  2. 用户B获取数组
  3. 用户A更改数组
  4. 用户B更改数组
  5. 用户A数组中的CAS - 获胜
  6. 数组中的用户B个案例 - 失败
  7. 用户B从2
  8. 重复