2011-07-26 8 views
0

ユーザーが投稿し、フォロワーがクリックしたすべてのリンクが、次の要件を満たすように赤字で保存されるシステムを設定しようとしています。すべてのリンクのすべてのクリックを保存するRedisデータ構造

  1. 時間枠内のほとんどのクリックされたリンク(今日、今週、すべての時間、またはカスタム)を取得することができます。

  2. 同じリンクを投稿したすべてのユーザーに問い合わせることができます。

  3. すでに多くのキーを使用していたので、これをすべて1つのRedisキーに保存するのが理想的です。

  4. 必要に応じて値をJSONにエンコードできます。一日で、そのハッシュは24個のフィールドが含まれるように

    -Iは、単一時間ある各フィールドを持つ単一のRedisのハッシュを使用します。ここでは

は、私がこれまでに思い付いたものです。

-In各フィールド、私はフォーマットを持つ配列からコードされるJSONを格納:

array("timestamp1" => array($url1, $url2, ...) 
    , "timestamp2" => array($url3, $url4, ...) 
    , ..., ...); 

-The完全な構造は、このハッシュである:

[01/01/2010 00:00] => JSON(...), 
[01/01/2010 01:00] => JSON(...), 
.... 

このように、私はすべて取得することができ任意の時間枠内の任意のURLをクリックします。

ただし、URLを投稿したすべてのユーザーを取得するためにこのハッシュを再利用することはできません。

質問は次のとおりです。もっと良い方法がありますか?

更新日07/30/2011:現在、分、時間、日、週、月、年を同じハッシュに保存しています。

ので、ワンクリックは、一度に多くのフィールドに格納されています - フィールドには分(フォーマットYmdHi) - フィールドに時間(フォーマットYmdH) - フィールドでの一日のために(フォーマットYmd) - 今週のフィールド(フォーマットYW) - 月のフィールド(フォーマットYm) - 年のフィールド(フォーマットY)。

これは、特定の時間枠を取得しようとすると、時間をかけてループするだけで、必要なフィールドにアクセスできるようになりました。

たとえば、2011年7月26日20:00から07/28/2011 02:00までのクリックが必要な場合は、7つのフィールドをクエリする必要があります:07/27/2011の1日の1フィールド07/26の20:00から23:00までの4つのフィールド、07/28の00:00から01:00までの2つのフィールド、さらに

答えて

2

3番目の要件を削除すると、はるかに簡単です。多くの人は、キーの代わりに常にハッシュを使うべきだと思っているようですが、これは特定の限られた状況の中でパフォーマンスを向上させるためのハッシュの使い方についての誤解のせいです。

最もクリックされたリンクを取得するには、値がリンクであり、スコアがクリックされている時間がZINCRBYで設定されている時間または曜日ごとにソートされたセットを作成します。 ZCARDとZREVRANGEBYSCOREを使用して上位10%を取得します。セットがシステム内のすべてのリンクを保持するのはもっとも簡単ですが、必要に応じて人気のないアイテムをセットから削除するための戦略があります。

リンクを投稿するすべてのユーザーを取得するには、リンクごとにユーザーのセットを格納します。 JSONとリンクの詳細を格納するキーまたはハッシュを使用してこれを行うことができますが、セットを使用すると更新やクエリが簡単になります。

+0

ありがとう、Mr. Clarkson! ソートされたセットを1時間ごとに使用するとキーが多すぎますか? 1年間のクリックでRedisの8760鍵が必要になります。すでにシステム内にある何百万もの鍵と一緒に、それは残忍かもしれませんね。 また、時間枠内でトップクリックしたリンクを取得する必要があります。たとえば、「先週からトップクリックしたリンクの10%を取得する」などです。それには、多くのソートセットを一緒にアクセスする必要があります。 – sntran

0

ハッシュキーのようなバケット戦略を使用するか、データ構造のサイズを制御できないため、ユーザーの月間のリンクの記録を保持することをお勧めします。特定のリンクを訪れる何百万人ものユーザーがいるでしょう。今すぐすべてのユーザーの詳細を取得するには、一度にスローされれば役に立たなくなります。私は何ができるかは、現在の状態のように振る舞うメタまたはカウンタのメタデータを維持し、memに保存されていないアーカイブストレージを維持することだと考えています。またはGemFireのようなメモリグリッドに行く

関連する問題