10

モバイル アプリを作成していますが、各ユーザーの情報を取得/配置するために API サービス バックエンドが必要です。ServiceStackでWeb サービスを開発する予定ですが、ストレージについて疑問に思っていました。Redisのような高速なメモリ内キャッシュ システムのアイデアは気に入っていますが、いくつか質問があります。

  1. データ ストアがどのように見えるかのサンプル スキーマを作成しました。これは、 MySQL DB などではなく、Redis を使用するのに適しているように思えますか?

    スキーマ http://www.miles3.com/uploads/redis.png

  2. Redis ストアをディスクに永続化するためのセットアップはどのくらい難しいですか? または、ストアへの書き込みを行うときに組み込みのようなものですか? (私はこのNoSQLの初心者です)

  3. 現在、Linux マイクロ インスタンスを使用してAWSにセットアップしています (1 年間無料であるため)。この回答には多くの要因が関係していることはわかっていますが、一般的に、これは私の Web サービスと Redis にとって十分でしょうか? Redis はインメモリなので、それで十分でしょうか? 私のモバイルアプリが急上昇したら (ねえ、私たちは夢を見ることができますか?)、インスタンスの上限に達し始めると思います.

4

1 に答える 1

29

NoSQL Redis アプリケーションを設計する際に考慮すべきこと

1) Redis で正しく開発するには、RDBMS 用のリレーショナル モデルではなく、C# コレクション クラスなど、C# プログラムで関係を構造化する方法についてもっと考える必要があります。RDBMS テーブルではなく、ドキュメント データベースのようなデータ ストレージについて考えるほうがよいでしょう。基本的にすべてがキー (インデックス) を介して Redis にブロブされるため、独自の「キー名前空間」に保持されるプライマリ エンティティ (つまり、集約ルート) が何であるか、または非プライマリ エンティティであるかどうかを判断するだけで済みます。親エンティティと一緒に永続化する必要があるメタデータ。

プライマリ データ ストアとしての Redis の例

以下は、Redis を使用して簡単なブログ アプリケーションを作成する手順を説明した優れた記事です。

http://www.servicestack.net/docs/redis-client/designing-nosql-database

Redis を使用した別の実世界の例については、RedisStackOverflowのソース コードを参照することもできます。

基本的に、各タイプのアイテムを個別に保存および取得する必要があります。

var redisUsers = redis.As<User>();
var user = redisUsers.GetById(1);
var userIsWatching = redisUsers.GetRelatedEntities<Watching>(user.Id);

エンティティ間の関係を保存する方法は、Redis のセットを利用することです。たとえば、ユーザー/ウォッチャーの関係を概念的に保存できます。

SET["ids:User>Watcher:{UserId}"] = [{watcherId1},{watcherId2},...]

Redis はスキーマレスでべき等です

ID を redis セットに格納することは冪等です。つまり、watcherId1を同じセットに複数回追加することができ、その出現は 1 回だけになります。これは、リレーションシップの存在を確認する必要がなく、関連する ID が存在しなかったかのように自由に追加し続けることができることを意味するため、優れています。

関連: 存在しない Redis コレクション (リストなど) への書き込みまたは読み取りは、空のコレクションへの書き込みと同じです。既存のリストは単に 0 の結果を返します。スキーマを使用するために事前にスキーマを定義する必要がないため、摩擦がなく、生産性が向上します。必要に応じて、Redis はEXISTS操作を提供してキーが存在するかどうかを判断するか、TYPE操作を提供してそのタイプを判断できるようにします。

書き込み時に関係/インデックスを作成する

覚えておくべきことの 1 つは、Redis には暗黙的なインデックスがないため、通常、書き込み中に自分自身を読み取るために必要なインデックス/関係をセットアップする必要があることです。基本的に、すべてのクエリ要件を事前に検討し、書き込み時に必要な関係を設定する必要があります。上記の RedisStackOverflow ソース コードは、これを示す良い例です。

注: ServiceStack.Redis C# プロバイダーは、主キーであるIdという一意のフィールドがあることを前提としています。ModelConfig.Id()構成マッピングで別のフィールドを使用するように構成できます。

Redis の永続性

2) Redis は、すぐに使用できる RDB と追加のみのファイル (AOF) の 2 種類の永続化モードをサポートしています。RDB は定期的なスナップショットを書き込みますが、追加専用ファイルはスナップショット間のすべての変更を記録するトランザクション ジャーナルのように機能します。それぞれの機能とアプリケーションのニーズに慣れるまで、両方を追加することをお勧めします。Redis の永続性はすべてhttp://redis.io/topics/persistenceで読むことができます。

注意 Redis は、http: //redis.io/topics/replicationで詳細を読むことができる単純なレプリケーションもサポートしています。

Redis は RAM が大好き

3) Redis は主にメモリ内で動作するため、最も重要なリソースは、データセット全体をメモリ内に保持するのに十分な RAM と、スナップショットをディスクに作成するときのバッファがあることです。Redis は非常に効率的であるため、小さな AWS インスタンスでも多くの負荷を処理できます。必要なのは、十分な RAM があることです。

Redis 管理 UI を使用してデータを視覚化する

最後に、 ServiceStack C# Redis クライアントを使用している場合は、エンティティの視覚的なビューを提供するRedis 管理 UIをインストールすることをお勧めします。http://servicestack.net/RedisAdminUI/AjaxClient/でライブ デモを見ることができます。

于 2011-11-30T21:22:53.543 に答える