2010-04-14

[翻訳]rediscookbook/4_higher_level_data_structures/implement_a_fifo_queue

### 問題

基本的な push と pop 操作でシンプルな抽象化された先入れ、先出しのキューを実装して Redis を使いたい。

### 解法

Redis 組み込みの `List` データ型は自然なキューです。事実、単なるキューの実装で、`List` 操作の限定されたセットを便利にする必要があります。

    redis> LPUSH queue1 tom
    (integer) 1
    redis> LPUSH queue1 dick
    (integer) 2
    redis> LPUSH queue1 harry
    (integer) 3
    redis> RPOP queue1
    tom
    redis> RPOP queue1
    dick
    redis> RPOP queue1
    harry


### 検討

Redis は *ブロッキングポップ*操作と同等の4つの基本的なリストプッシュとポップ操作(RPUSH, LPUSH, LPOP, RPOP)が提供されています。これらはすべて O(1) オーダで、コマンドの時間的コストはリストの長さに依存しません。

Redis コマンド上で簡単なキューを実装するには、簡単で、さらっと Redis の力を把握するには良いイントロです。

例えば、ここに、オブジェクトレベルの相互作用(新しいキューの ID を一意にするために INCR を使います)を提供する Python キューがあります。:

    r = redis.Redis()

    class Queue(object):
        """抽象 FIFO キュー"""
        def __init__(self):
            local_id = r.incr("queue_space")
            id_name = "queue:%s" %(local_id)
            self.id_name = id_name

    def push(self, element):
        """キューの最後に要素を Push する"""
            id_name = self.id_name
            push_element = redis.lpush(id_name, element)

    def pop(self):
        """キューの最初の要素を Pop する。"""
            id_name = self.id_name
            popped_element = redis.rpop(id_name)
            return popped_element


### 参照

0 件のコメント:

コメントを投稿