翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
キャッシュを使用してデータベースの需要を減らす
概要
キャッシュを効果的な戦略として使用して、 NETアプリケーションのコストを削減できます。アプリケーションがデータへの頻繁なアクセスを必要とする場合、多くのアプリケーションは SQL Server などのバックエンドデータベースを使用します。需要に対応するためにこれらのバックエンドサービスを維持するコストは高額になる可能性がありますが、効果的なキャッシュ戦略を使用して、サイジングとスケーリングの要件を減らすことでバックエンドデータベースの負荷を軽減できます。これにより、コストを削減し、アプリケーションのパフォーマンスを向上させることができます。
キャッシュは、SQLサーバーなどのより高価なリソースを使用する読み取り負荷の高いワークロードに関連するコストを削減するのに役立つ手法です。ワークロードに適した手法を使用することが重要です。例えば、ローカルキャッシュはスケーラブルではなく、アプリケーションのインスタンスごとにローカルキャッシュを維持する必要があります。潜在的なコストと比較してパフォーマンスへの影響を比較検討し、基盤となるデータソースのコストが低いほど、キャッシュメカニズムに関連する追加コストが相殺されます。
コストへの影響
SQL サーバーでは、データベースのサイズ変更時に読み取りリクエストを考慮する必要があります。これは、ロードに対応するためにリードレプリカを導入する必要があるため、コストに影響を与える可能性があります。リードレプリカを使用している場合は、SQLServer Enterprise Edition でのみ利用できることを理解することが重要です。このエディションには、SQLServer Standard エディションよりも高価なライセンスが必要です。
次の図は、キャッシュの有効性を理解するのに役立つように設計されています。Server Enterprise Edition を実行している 4 つの db.m4.2xlarge ノードSQLを持つ Amazon RDS for SQL Server を示します。これは、1 つのリードレプリカを持つマルチ AZ 設定にデプロイされます。排他的リードトラフィック (SELECTクエリなど) は、リードレプリカに送信されます。これに対して、Amazon DynamoDB は r4.2xlarge 2 ノードの DynamoDB Accelerator (DAX) クラスターを使用します。
次の表は、高読み取りトラフィックを処理する専用リードレプリカが不要になった結果を示しています。
リードレプリカなしでローカルキャッシュを使用するか、Amazon 上の SQL Server をキャッシュレイヤーRDSとしてDAX並列に導入することで、大幅なコスト削減を実現できます。このレイヤーは SQL Server からオフロードされ、データベースの実行に必要な SQL Server のサイズが小さくなります。
コスト最適化に関する推奨事項
ローカルキャッシュ
ローカルキャッシュは、オンプレミス環境またはクラウドの両方でホストされているアプリケーションのコンテンツをキャッシュする最も一般的な方法の 1 つです。これは、実装が比較的簡単で直感的だからです。ローカルキャッシュには、データベースやその他のソースからコンテンツを取得し、メモリまたはディスクでローカルにキャッシュして、より迅速にアクセスすることが含まれます。このアプローチは実装は簡単ですが、一部のユースケースには適していません。例えば、アプリケーション状態やユーザー状態の保存など、キャッシュコンテンツを長期間保持する必要がある場合のユースケースなどです。もう 1 つのユースケースは、キャッシュされたコンテンツに他のアプリケーションインスタンスからアクセスする必要がある場合です。
次の図は、4 つのノードと 2 つのリードレプリカを持つ高可用性SQLサーバークラスターを示しています。
ローカルキャッシュでは、複数のEC2インスタンス間でトラフィックの負荷分散が必要になる場合があります。各インスタンスは、独自のローカルキャッシュを維持する必要があります。キャッシュにステートフル情報が格納されている場合、データベースへの定期的なコミットが必要であり、ユーザーは後続のリクエスト (スティッキーセッション) ごとに同じインスタンスに転送される必要がある場合があります。これは、一部のインスタンスが過剰に利用される可能性があり、トラフィックの分散が不均等であるために十分に利用されないため、アプリケーションのスケーリングを試みる際に課題となります。
. アプリケーションではNET、ローカルキャッシュをメモリ内またはローカルストレージのいずれかで使用できます。そのためには、ディスクにオブジェクトを保存して必要に応じて取得するか、データベースからデータをクエリしてメモリに保持する機能を追加できます。例えば、C# の SQL Server からのデータのローカルキャッシュインメモリとローカルストレージを実行するには、 MemoryCache
と LiteDB
ライブラリの組み合わせを使用できます。 MemoryCache
はインメモリキャッシュを提供しますが、 LiteDB
は高速で軽量な組み込みの NoSQL disk ベースのデータベースです。
インメモリキャッシュを実行するには、 を使用します。NET ライブラリ System.Runtime.MemoryCache
。次のコード例は、 System.Runtime.Caching.MemoryCache
クラスを使用してメモリ内のデータをキャッシュする方法を示しています。このクラスは、アプリケーションのメモリにデータを一時的に保存する方法を提供します。これにより、データベースや などのより高価なリソースからデータを取得する必要性を減らすことで、アプリケーションのパフォーマンスを向上させることができますAPI。
コードの仕組みは次のとおりです。
-
MemoryCache
という名前のプライベート静的インスタンス_memoryCache
が作成されます。キャッシュには、識別する名前 (dataCache
) が付けられます。次に、キャッシュはデータを保存および取得します。 -
GetData
メソッドは、string
キーと と呼ばれるFunc<T>
委任という 2 つの引数を取る汎用メソッドですgetData
。キーはキャッシュされたデータを識別するために使用されますが、getData
委任は、データがキャッシュに存在しない場合に実行されるデータ取得ロジックを表します。 -
メソッドはまず、
_memoryCache.Contains(key)
メソッドを使用してキャッシュにデータが存在するかどうかを確認します。データがキャッシュにある場合、 メソッドは を使用してデータを取得し_memoryCache.Get(key)
、期待されるタイプ T にキャストします。 -
データがキャッシュにない場合、メソッドは
getData
代理を呼び出してデータを取得します。次に、 を使用してデータをキャッシュに追加します_memoryCache.Add(key, data, DateTimeOffset.Now.AddMinutes(10))
。この呼び出しでは、キャッシュエントリが 10 分後に期限切れになることを指定します。その時点で、データはキャッシュから自動的に削除されます。 -
ClearCache
メソッドはstring
キーを引数として受け取り、 を使用してそのキーに関連付けられたデータをキャッシュから削除します_memoryCache.Remove(key)
。
using System; using System.Runtime.Caching; public class InMemoryCache { private static MemoryCache _memoryCache = new MemoryCache("dataCache"); public static T GetData<T>(string key, Func<T> getData) { if (_memoryCache.Contains(key)) { return (T)_memoryCache.Get(key); } T data = getData(); _memoryCache.Add(key, data, DateTimeOffset.Now.AddMinutes(10)); return data; } public static void ClearCache(string key) { _memoryCache.Remove(key); } }
次のコードを使用できます。
public class Program { public static void Main() { string cacheKey = "sample_data"; Func<string> getSampleData = () => { // Replace this with your data retrieval logic return "Sample data"; }; string data = InMemoryCache.GetData(cacheKey, getSampleData); Console.WriteLine("Data: " + data); } }
次の例は、LiteDBLocalStorageCache
クラスには、キャッシュを管理するための主要な関数が含まれています。
using System; using LiteDB; public class LocalStorageCache { private static string _liteDbPath = @"Filename=LocalCache.db"; public static T GetData<T>(string key, Func<T> getData) { using (var db = new LiteDatabase(_liteDbPath)) { var collection = db.GetCollection<T>("cache"); var item = collection.FindOne(Query.EQ("_id", key)); if (item != null) { return item; } } T data = getData(); using (var db = new LiteDatabase(_liteDbPath)) { var collection = db.GetCollection<T>("cache"); collection.Upsert(new BsonValue(key), data); } return data; } public static void ClearCache(string key) { using (var db = new LiteDatabase(_liteDbPath)) { var collection = db.GetCollection("cache"); collection.Delete(key); } } } public class Program { public static void Main() { string cacheKey = "sample_data"; Func<string> getSampleData = () => { // Replace this with your data retrieval logic return "Sample data"; }; string data = LocalStorageCache.GetData(cacheKey, getSampleData); Console.WriteLine("Data: " + data); } }
頻繁に変更されない静的キャッシュまたは静的ファイルがある場合は、これらのファイルを Amazon Simple Storage Service (Amazon S3) オブジェクトストレージに保存することもできます。アプリケーションは、起動時に静的キャッシュファイルを取得してローカルで使用できます。を使用して Amazon S3 からファイルを取得する方法の詳細についてはNET、「Amazon S3 ドキュメント」の「オブジェクトのダウンロード」を参照してください。
を使用したキャッシュ DAX
すべてのアプリケーションインスタンスで共有できるキャッシュレイヤーを使用できます。DynamoDB Accelerator (DAX) は、DynamoDB 用のフルマネージド型の高可用性インメモリキャッシュで、10 倍のパフォーマンス向上を実現できます。DAX DynamoDB テーブルで読み取りキャパシティーユニットをオーバープロビジョニングする必要性を減らすことで、 を使用してコストを削減できます。これは、読み取りが多く、個々のキーに対して繰り返し読み取りが必要なワークロードに特に役立ちます。
DynamoDB はオンデマンドまたはプロビジョニングされた容量で料金設定されるため、1 か月あたりの読み取りと書き込みの回数がコストに寄与します。大量のワークロードを読み取る場合、DAXクラスターは DynamoDB テーブルの読み取り数を減らすことでコストを削減できます。を設定する方法についてはDAX、DynamoDB ドキュメントの「DynamoDB Accelerator (DAX) によるメモリ内アクセラレーション」を参照してください。 DynamoDB .NET アプリケーション統合の詳細については、「 DAXへの Amazon DynamoDB の統合」を参照してくださいASP。NET でのアプリケーション
追加リソース
-
DynamoDB Accelerator によるインメモリアクセラレーション (DAX) - Amazon DynamoDB (DynamoDB ドキュメント)DynamoDB
-
オブジェクトのダウンロード (Amazon S3 ドキュメント)