ユーザーが投稿し、フォロワーがクリックしたすべてのリンクが、次の要件を満たすように赤字で保存されるシステムを設定しようとしています。すべてのリンクのすべてのクリックを保存するRedisデータ構造
時間枠内のほとんどのクリックされたリンク(今日、今週、すべての時間、またはカスタム)を取得することができます。
同じリンクを投稿したすべてのユーザーに問い合わせることができます。
すでに多くのキーを使用していたので、これをすべて1つのRedisキーに保存するのが理想的です。
必要に応じて値を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つのフィールド、さらに
ありがとう、Mr. Clarkson! ソートされたセットを1時間ごとに使用するとキーが多すぎますか? 1年間のクリックでRedisの8760鍵が必要になります。すでにシステム内にある何百万もの鍵と一緒に、それは残忍かもしれませんね。 また、時間枠内でトップクリックしたリンクを取得する必要があります。たとえば、「先週からトップクリックしたリンクの10%を取得する」などです。それには、多くのソートセットを一緒にアクセスする必要があります。 – sntran