Memcached - GET和SET操作是原子的吗?

时间:2011-08-28 20:34:49

标签: concurrency memcached high-availability

以下是该场景:一个查询memcached缓存的简单网站。每10-15分钟由批处理作业更新相同的缓存。有这种模式有什么可能出错(例如缓存未命中)?

我担心可能发生的所有可能的比赛情况。例如,如果网站对memcached中缓存的对象执行GET操作,而批处理作业覆盖了同一个对象,那么会发生什么?

3 个答案:

答案 0 :(得分:6)

我最初的直觉是你应该能够从没有副作用的memcached缓存中读/写(除了由于竞争条件而导致过时数据的可能性)。

关于memcached的常见问题解答:

  

memcached是原子的吗?除了你可能遇到的任何错误,是的   命令是内部原子的。同时发布多个集合   没有任何不良影响,除了最后一个是那个   棒。

在不了解您的具体情况的情况下,我无法就缓存未命中是否可能提出建议,但我确实总结说缓存应该是寻求数据的第一层,而不是唯一层;我仍然会在缓存后面有一个数据库或其他来源来处理所有缓存未命中。

答案 1 :(得分:2)

  

以下是该场景:一个查询memcached缓存的简单网站。每10-15分钟由批处理作业更新相同的缓存。有这种模式有什么可能出错(例如缓存未命中)?

请记住,memcached不保证存储在其中的数据将始终保留在缓存中(例如,它是缓存,而不是数据库)。如果您正在将memcached用于其他数据,则在批量作业重新插入之前,此查询的结果可能会从缓存中逐出。

答案 2 :(得分:2)

如果您收到数据,它将是您存储的最新正确数据。

您永远不会收到更新的一半,所以从这个角度看,它是原子的。对给定密钥的每个请求都将返回该密钥的所有内容或根本不返回任何内容。