2016-03-28 14 views
2

私のウェブサイトでは、ユーザーは会話を使用してコミュニケーションをとることができます。受信ボックスのRedisデータ構造の設計

会話の受信ボックスページでは、特定のユーザーからの最新のメッセージのプレビューなど、連絡を受けたすべてのユーザーを表示できます。ページは、プレビューされたメッセージの日付順です。

UserA "Some message.." 2016-3-3 
UserB "Other message.." 2016-3-2 
UserC "..."    2016-2-15 
etc.. 

私はこれを効率的にモデル化するために使用するRedisのデータ構造の正しい組み合わせがあると思いまして:

それはおよそ次のようになります。

最初はソートされた一連のユーザー(UserA、UserB、UserC)があると思っていましたが、これは各ユーザーから最新のメッセージを受け取るためにループが必要なことを意味します。

ループを避けるより良い方法はありますか?

ありがとうございます!

+0

メッセージ受信者のソートセットを他のユーザーの受信ボックスに入れておくのはなぜですか? –

+0

あなたの提案を正しく理解していれば、各ユーザーからの最新のメッセージのみを表示したいからです。たとえば、問題のuserXには、UserBからの1メッセージの後にUserAが送信した1000メッセージがあります。私は999のメッセージを捨てなければならない。 –

答えて

0

各ユーザーの受信トレイには、ハッシュとソートセットの2つのデータ構造が必要です。

いずれにしても辞書順の並べ替えを使用するため、ソートセットのスコアはすべて0に設定できます(ただし、少なくともこの回答の文脈ではメッセージの実際のタイムスタンプに設定することには問題ありません)。ソートセットのメンバーを以下のようにして構成する必要があります。

<date in YYYYMMDD>:<from user>:<message> 

これは、あなたが簡単にZREVRANGEとそれを介してそのビューとページを引っ張るようになります。

これは半分にすぎませんが、userXにuserAの新しいメッセージが送信されると、userAの前のメッセージをuserXの受信ボックスから探して削除する必要があります。そのため、ハッシュが必要です。

ハッシュは、特定のユーザーからuserXに最新のメッセージをルックアップするために使用されます。 userXの各友達については、送信ユーザのID(例:userA)で値がそのユーザからの最新のメッセージを表す受信ボックスのソートセットメンバー(上記と同じ「構文」)であるフィールドをハッシュで保持します。新しいメッセージが到着したら、最初にハッシュから以前のメッセージをフェッチし、それをセットから削除してから、新しいメッセージをセットに追加し、ハッシュのフィールドを更新します。

ハッシュとソートセットが一貫していることを確認するには、トランザクション内でそれらをまとめてラッピングすることを検討することをお勧めします。 MULTI/EXEC blockを使うことができますが、私の好みはLuaスクリプトです。

+0

ありがとう!それはまさに私が探していたものです。 –

関連する問題