MongoDB、CouchDB、Redis、Tokyo Cabinet、その他の NoSQL データベースの経験はすでにあります。最近、私は Riak に出くわしましたが、とても興味深いようです。それを始めるために、NoSQL World の「Hello World」という小さな Twitter クローンを作成することにしました。完全に機能するクローンを取得するには、ツイートを時系列に並べる必要があります。Riak のドキュメントを読んだ後、Map-Reduce がこの仕事に適したツールであることがわかりました。私の開発環境では非常にうまく機能しますが、何百もの並列クエリがある本番環境でのパフォーマンスはどうですか? データをソートするための他の、おそらくより高速な方法はありますか、またはデータを順序付けられた形式 (Cassandra など) で保存することは可能ですか?
この問題に対する別の解決策を見つけたと思います - 単純なリンクリストです。したがって、考えられる実装の 1 つは、すべてのユーザーが独自の「タイムライン バケット」を取得し、そこにツイート データ自体へのリンクが保存されることです (ツイートは「ツイート」バケットに個別に保存されます)。ご存じのとおり、このタイムライン バケットには、最新のタイムライン オブジェクトにリンクし、リストの開始点となる「first」という名前のキーが含まれている必要があります。タイムラインに新しいツイートを挿入するには、タイムライン バケットに新しいアイテムを挿入し、この新しいアイテムの「次へ」リンクを「最初の」アイテムに設定し、その後、新しいアイテムを「最初」にします。
つまり、リンクされたリストで行うようにアイテムを挿入します...
Twitter と同様に、個人のタイムラインには、ユーザーに表示される 20 個のツイートが保持されます。最新の 20 件のツイートを受け取るために必要なクエリは 2 つだけです。処理を高速化するために、最初のクエリは Riak のリンク ウォーキング機能を使用して、「next」でタグ付けされた最新の 20 個のオブジェクトを取得します。最後に、2 番目の最後のクエリは、最初のクエリによって計算されたキーを使用して、ツイート自体を受信します (map/reduce を使用)。
フォローを外したばかりのユーザーのツイートを削除するには、Riak 1.0 のセカンダリ インデックス機能を使用して、関連するタイムライン オブジェクト/ツイートを受け取ります。