キャッシュでよく使われるmemcachedはロック機構が存在しないようですが、

仮に全く同じタイミングでキーの追加や更新を行って競合が発生した場合、
そのキーは消えるなど、どのような挙動になるのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2009/05/17 15:14:14
  • 終了:2009/05/24 15:15:02

回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/05/17 16:28:56

ポイント35pt

ご質問の「ロック機構」というのは、RDBMSのロックを意味しているのではないかと思いました。そういうロック機構は、memcached には存在しません。memcached に対するトランザクション制御はアプリ側に任されているからです。


memcached の追加(add)は同じキーを受け付けないので、キー名競合は起こりません。

更新(replace)は、同時に1つしか受け付けないので、デッドロックが発生することはありません。


ただし、memcached はRDBMSなどのストレージとセットで利用されることが多いので、アプリ側でしっかりしたトランザクション制御をしてやる必要があります。その方式については、「勝手に図解するmemcached」に詳しく記されています。

id:xxmasaxx

言葉足らずですみません、追加とはDBでいうinsertのことでした。

ファイルロックを使ったCGIカウンタの場合、書き込み時に競合が発生するとファイルが消えるようですが、

memcachedの場合も同様に、データが消えるのかどうか知りたかったのです。

ともあれ回答有り難うございました。リンク先も参考にさせて頂きます。

2009/05/17 17:33:35
id:y-kawaz No.2

y-kawaz回答回数1420ベストアンサー獲得回数2252009/05/18 00:13:35

ポイント35pt

>言葉足らずですみません、追加とはDBでいうinsertのことでした。

>ファイルロックを使ったCGIカウンタの場合、書き込み時に競合が発生するとファイルが消えるようですが、

>memcachedの場合も同様に、データが消えるのかどうか知りたかったのです。


アプリ側で特にロック処理をおこなわずget&setでカウンタを作ったとすれば、競合が原因でデータを消失することはありませんが、カウント漏れは発生する可能性はあります。

データ消失に関しては、そもそも素のmemcachedはディスクへの書き込みを行いませんので競合ではなくmemcachedの停止によりデータが消えると思います。

また、単にカウンタを作りたいのであればget&setでカウントアップするのではなくincrを使えば競合アトミックにカウントアップを行うことができます。

id:xxmasaxx

なるほど。データの消失はないのですね。

ちなみにカウンタはあくまで一例で、カウンタを作りたいわけではありませんが、

incrでアトミックに行えるのは知りませんでした。回答有り難うございます。

2009/05/18 02:18:08

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません