2012-03-07 4 views
4

私は私のアプリにソーシャルネットワークの側面を持っていると私はこの答えのようなアクティビティストリームを実装している:リスト内のすべてのユーザー通知をredisで保持しますか?

How to implement the activity stream in a social network

等があった、システム内のすべての通知は、私が(ユーザーごとにRedisの中に押し込みます

key       value 
user:1:notifications  [25, 24, 23] 
user:2:notifications  [24, 22, 17, 13, 5, 4] 
... 

だから、私のテーブルのみの活動と、これを原因となるユーザーを持っています、活動リレーショナルテーブルからIDのリスト(値)を通知されている)キーを押します。何が起こるのは、私はレディスで通知を受け取ったユーザとmysqlには何も持っていないということだけです...

私の質問は、このIDをレディスで無限に、またはmemcachedで定期的にこのリストをトリミングしますか?

答えて

3

これらの通知をレディスで永続的に保持する必要はありません。それはまったく逆です:ユーザーがログインすると、あなたが彼のために持っているすべての通知をredisで表示してから、リストを切り捨てる(または固定長に調整する)。

+0

しかし、Facebookでは、たとえば、すべての通知を取得することが可能です。 https://www.facebook.com/notifications – Luccas

+3

**すべての**通知ではありません。私は先週しか見ることができません。同様に、最後のN個の通知をユーザーごとに保持できます。 –

7

これはプログラミングアーキテクチャよりもアプリケーションアーキテクチャ/設計の問題のほうが多いため、理論的に正しい答えはありません。しかし、実際には、Redis/Memcacheおよび他の多くのこのような実装は、であり、非常に大きな(または急速に成長する)データセットを保持することを意味するものではありません。

nisqlデータ・ストアとして、Redisはメモリーを使用し、ハード・ディスク上のミラーを使用します。したがって、格納できるデータのサイズに制限はありませんが、理想的にはRedisに割り当てようとしている空きメモリよりも小さくする必要があります。

すべてのベースをカバーする最も簡単な解決策は、生成されたユーザー活動データをレディスに保存することです。レディスを使用して通知などを表示します。事前定義された日数(またはユーザーあたりの事前定義されたアクティビティ数)より古いすべてのアクティビティログを切り捨てて、通常のデータベースに保存します。

ユーザーがすべての通知を取得したい場合、スピード・ロスが許容されます(頻繁で必要なアクションではないため)。そして、Redisを迂回してデータベースからプルできます。

代替: また、使用するソリューションはアプリケーションの実際の数に基づいて選択することをお勧めします。しかし、あなたはこれを行うこともできます、データベースユーザーのログインいずれについても

    • ストアすべての活動をフェッチし、Redisの中にすべての活動を保存するのRedis
    • から、そのユーザの活動/通知を削除し、ログアウトで
    • アクティビティを追加するときに、影響を受けるユーザーがオンラインであるかどうかを確認するために追加のロジックが必要です。いずれの場合も、データベースにアクティビティを追加する必要がありますが、影響を受けるユーザがオンラインの場合は、Redisのハッシュにもプッシュしてください。
  • +0

    お返事ありがとうございました! – Luccas

    +0

    @Luccas:私の快楽の男。これらのアーキテクチャとデザインパターンの質問は私のお気に入りです!ソリューションの優雅さと何か:あなたが何をすることを私に教えてください。 –

    +1

    @Luccas最後に何をやったの? –

    関連する問題