QA@IT

Redisで長さ1のキューを実現したい

2646 PV

早い者勝ちでそのスロットに置いたものを持って行かせたいのです。そして、スロットに置かれたものがまだ未消化の状態でさらに追加されたら、古いものを新しいもので上書きしたい(長さ1のキュー)のです。

たとえば、

SET mykey "Hello"
DEL mykey

のDELで"Hello"が帰ってくれば、SETは冪等性があるので望みどおりのことが実現できるのですが、実際にはDELは削除件数をかえします。

LPUSHRPOPだと、取り出し操作はアトミックになるのですが、キューなのでLPUSHを連打すると重複したデータが入ってしまいます。

MULTIアリ、Redis 2.6のscriptingもアリ、とにかく一番簡潔に書けるのがいいです。どうするのがいいでしょうか。

なお、やんごとなき事情によりワーカーは(比較的長いインターバルで)ポーリングせざるをえないという前提があります。(BLPOPとかは使えないという意味です)

回答

長さ1なら、それはもはやキューではありません。
単一の文字列型データです。

SETで値をセットし、GETSETで値を"NULL"に入れ替えれながら、値を取り出せば良いと思います。

編集 履歴 (0)
  • おぉ、素晴らしい!まさしくこれです。取り出しが一度しかできないというセマンティクスに重きを置いてキューと表現しましたが、たしかにもはやキューじゃないですね。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。