2017-11-10 5 views
1

Redisでキューイングシステムに近づいているときに間違った考え方をしている可能性があります。Redisがキューイング管理メカニズムを処理しています

私はこの単純なキューを持っています。メールは1つのコレクションに積み重ねてから、そのスタックの利用可能な電子メールを取得してディスパッチします。

システムはNodeJSで構築されているので、私はnode-redis libを使っています。

キュー(スタック)は常に新しいメッセージを追加(プッシュ)し、もう一方の端ではプッシュした最初のアイテムをポップすることで、常に利用可能であると考えられています。

私はRedisのマニュアルで見つけたもので、あまりにもJavascript'ishだと思うかもしれませんが、それは当てはまらないかもしれないので、ここで私はあなたにRedis言語。簡単な例を使用して

は、JSONに、ここで私のキュースタックがあります:

を:

queue = [ 
{ 
    _id: 5a05eec08a7e66eb10ad6361, 
    email: "some html content in here", 
    domain: "domain.com" 
}, 
{ 
    _id: 5a05eb785710017b7d7a0243, 
    email: "some more html content here", 
    domain: "domain.com" 
}, 
... 
] 

そしてRedis Documentation を見て、私はこのような何かを行うことによって、スタック上に各電子メールをプッシュすることができると私を発見しました

HMSET queue:5a05eec08a7e66eb10ad6361 email "some html content in here" domain "domain.com" 
HMSET queue:5a05eb785710017b7d7a0243 email "some more html content here" domain "domain.com" 

そして、私は明示的にこのように1 'コレクション' を取得することができます:

HMGET queue:5a05eec08a7e66eb10ad6361 email 
HMGET queue:5a05eec08a7e66eb10ad6361 domain 
HMGET queue:5a05eb785710017b7d7a0243 email 
HMGET queue:5a05eb785710017b7d7a0243 domain 

これまで、すべてがかなりバニラです。しかし問題は、1つのキューイングシステムになるときです。実際には、PUSHおよびPOP機能を使用する必要があります。

私は実際にRedisが提供するPUSHとPOPのメカニズムを見つけることができましたが、私は単一次元のKEYを扱うときにしか使用できませんでした。

だから、私の場合には、代わりのような単一の項目をポップの:私は戻ってくる順番に

RPOP queue //see the abstraction here? calling the stack and not a single item? 

で - と同じで:

RPOP email 

私は本当にこのようなものが必要time remove - このキューコレクション内の最後の項目

ので、

RPOP queue //or whatever other command I couldn't find 

は私

{ 
    _id: 5a05eb785710017b7d7a0243, 
    email: "some more html content here", 
    domain: "domain.com" 
} 
に別の

RPOP queue 

リターンでくれ、その後

{ 
    _id: 5a05eec08a7e66eb10ad6361, 
    email: "some html content in here", 
    domain: "domain.com" 
} 

...とを、与えるべきです

そして、この "キュー"を空にするまで、1つ。

私は自分が持っている考え方と問題そのものを公開することで私が明確になることを希望します。

HMGETメカニズムを使用してキュー内で反復処理を行うことはできません。一方の端が下から項目をポップしていて、もう一方の端が新しい項目を上に積み重ねている可能性があります。だから、コーディングを介していくつかの '再インデックス化'メカニズムを維持することは、あまりにも多くのハックになります。

これまで、私は、この「マルチディメンション」スタックアプローチのサポートを提供するために必要なツールをRedisが提供していないと考え始めました。どちらがうまいですか、レディスは私の必要とする答えではないかもしれません。

しかし私は現在、間違った考え方をしている可能性があることを認識しています。おそらくRedisはそれに対処するエレガントな方法を提供しますが、まったく異なるアプローチです。 RPUSHとLPOPで動作させることはできません。すでに述べたように、単純な単一次元のKEY VALUEを処理する方法しかありません。

Redisがこれをサポートしていない場合は、すでにNodeJSエンドポイントで回避策を実装しています。しかし、コードが多いほど潜在的なバグを意味します。

平和

答えて

1

あなたは自分のサブ要素にアクセスする場合を除きあなたは、個別のハッシュにあなたのキューの内容を分割する必要はありません。あなたが正しく理解していれば、古典的なLPUSH/RPOPリストキューパターンが必要です。そのリスト内のメンバーは何もすることができますが、あなたのケースで最も簡単なのは、単に各要素の生のシリアル化されたJSONを保管することです、例えば:

LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}' 
+0

は、それは非常に単純なものだった、Itamar-ハーバー@ありがとう私はそれを見ることができませんでした。なぜなら、オブジェクトをポップ/プッシュするためには、LMHPUSH/RMHPOPのような奇妙なものが必要だと思っていたからです。 それは私の疑問を解決し、露出した問題について私の考え方を修正しました。 –

+1

偉大な気がします。 –

関連する問題