2011-09-17 39 views
3

在Memcached的official FAQ中我讀到:get_multi/set_multi原子?

「發送到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調用`設置({ '一個':1})
  • 機A調用`設置({ 'B':2 })
  • 機B調用get_multi(['a', 'b'])和接收{'a': 0, 'b': 2}

這個問題是隻爲我的設計很重要,我想我最好先問問˚F或確認。

回答

3

As I read this section,get_multi發出多個並行運行的請求,這個想法是對於大的請求,get_multi允許總時間減少所有結果。我沒有看到任何保證或提及一起完成的獨立請求是集體原子的。相同的規則可能適用於set_multi(即,各個請求是原子的,但它們的集合不是)。

似乎也沒有提及交易。

+0

我認爲你是對的。它似乎協議甚至不支持它。我錯誤地認爲庫例程與實際的緩存操作是1-1對應的。 – julkiewicz

+0

正確。 get_multi是一個優化。在二進制協議中,您可以通過將多個對象發送到一起來進行類似的優化,但它們都是有效的單個請求。 – Dustin