get_multi / set_multi atomic?

时间:2011-09-17 16:35:09

标签: multithreading caching concurrency memcached atomic

在Memcached我的official FAQ中读到:

“发送到memcached的所有单个命令都是绝对原子的。”

然而,对于get_multiset_multi,我仍然不清楚这一点。我想知道get_multiset_multi在以下意义上是否是原子的:

  • set_multi执行的所有写操作将以原子方式一起执行。
  • get_multi执行的所有读取将以原子方式一起执行。

例如,这些情况应该是不可能的:

1)

  • 最初缓存的内容为{'a': 0, 'b': 0}
  • 机器A拨打set_multi({'a': 1, 'b': 1})
  • 机器B拨打get_multi(['a', 'b'])并接听{'a': 1, 'b': 0}

2)

  • 最初缓存的内容为{'a': 0, 'b': 0}
  • 机器A调用`set({'a':1})
  • 机器A调用`set({'b':2})
  • 机器B拨打get_multi(['a', 'b'])并接听{'a': 0, 'b': 2}

这个问题对我的设计非常重要,我认为我最好要求确认。

1 个答案:

答案 0 :(得分:3)

As I read this sectionget_multi发出多个并行运行的请求,其想法是,对于大型请求,get_multi允许总时间量减少所有结果。我没有看到任何保证或提及共同完成的独立请求是集体原子的。同样的规则可能适用于set_multi(即各个请求是原子的,但它们的集合不是)。

似乎也没有提及交易。