NCache は、Entity Framework Core (EF Core) 用の分散型インメモリキャッシュプロバイダーであり、クエリ結果をキャッシュすることでデータベースのボトルネックを解消します。ただし、いくつかの制限があります。高トランザクションの EF Core アプリケーションでは、データベースクエリが多すぎるため、データベース層でパフォーマンスの問題が発生する可能性があります。アプリケーション層は水平方向にスケーリングできますが、データベース層がボトルネックとなります。
NCacheは、100% ネイティブの .NET 分散キャッシュであり、頻繁にアクセスされるデータをキャッシュし、データベース クエリをオフロードすることで、EF Core アプリケーションを強化します。これにより、パフォーマンスとスケーラビリティが向上し、データベース全体の負荷が軽減されます。
NCache 拡張する EFコア C# 拡張メソッドを使用すると、既存のロジックを変更することなくシームレスなキャッシュが可能になります。
トランザクションデータには、顧客情報、注文、取引など、頻繁に変更されるレコードが含まれます。これらの頻繁にアクセスされるデータを短期的にキャッシュすることで、データベースクエリが削減され、応答時間が短縮され、競合が最小限に抑えられます。
メソッド: FromCache(), FromCacheAsync()
キャッシュから(): クエリ結果が利用可能な場合はキャッシュから取得し、そうでない場合はデータベースから取得して、将来使用するために結果をキャッシュに保存します。 FromCache() Group By、Order By Ascending、Order By Descending、Sum、Min、Max、Average、Count、Contains、Like、FirstOrDefault 関数をサポートします。
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCache(options).ToList();
参照データには、製品カタログや参照値など、比較的静的なデータセットが含まれます。これらのデータを長期キャッシュすることで、冗長なデータベースクエリが排除され、アプリケーションの速度が向上します。
メソッド: LoadIntoCache(), LoadIntoCacheAsync()
LoadIntoCache(): データセット全体をキャッシュにロードし、後続のクエリでデータベースではなくキャッシュから直接データを取得できるようにします。
var resultSet = (from custOrder in context.Orders
where custOrder.Customer.CustomerId == someCustomerId
select custOrder).LoadIntoCache(out string cacheKey, options);
キャッシュから参照データを直接取得すると、アプリケーションはデータベース クエリを回避でき、応答時間が向上します。ただし、正確な結果を確保し、不完全なクエリ応答を回避するには、データセット全体をキャッシュに事前にロードする必要があります。 (データベース呼び出しなしでキャッシュから直接データを取得する).
メソッド: FromCacheOnly(), FromCacheOnlyAsync()
FromCacheOnly(): クエリ結果をキャッシュからのみ取得し、データベースへのクエリは行いません。これにより、プリロードされたデータセットの参照が超高速になります。ただし、これを効果的に機能させるには、クエリの精度を維持するために、データセット全体がキャッシュされている必要があります。
var resultSet = (from cust in context.Customers
where cust.CustomerId == someCustomerId
select cust).FromCacheOnly();
NCache EF Coreの拡張メソッドのみに依存せずに、キャッシュされたエンティティを効率的に管理するための直接APIを提供します。このキャッシュAPIを使用すると、開発者はプログラムによってキャッシュ内のオブジェクトを挿入、更新、削除できるため、キャッシュの動作を細かく制御しながら、高パフォーマンスアプリケーションのデータ取得を最適化できます。
キャッシュ内でエンティティを直接挿入、削除、更新します。
ICache cache = CacheManager.GetCache(cacheName);
// Inserting an entity into cache
cache.Insert(customerKey, cacheItem);
遅延クエリ実行により、アプリケーションは次のような集計関数を実行できます。 カウント(), 和(), 平均() データベースを繰り返しクエリするのではなく、キャッシュされたデータに直接アクセスします。この機能は、CountやSumなどの集計をインメモリキャッシュ内で直接実行することで、大規模なデータセットをクライアントにフェッチする際のネットワークオーバーヘッドを排除します。これにより、冗長なクエリが削減され、パフォーマンスが向上し、高トランザクション環境でのデータ取得が高速化されます。
using (var context = new NorthwindContext())
{
var resultSet = context.Products
.Where(p => p.UnitPrice == 10)
.GroupBy(p => p.ProductName)
.Select(group => group.Key)
.FromCache(out cacheKey, options)
.ToList();
}
NCache アプリケーションはキャッシュされたデータに対してLINQクエリを直接実行できるため、データベースクエリを繰り返す必要がなくなります。インメモリ処理を活用することで、このアプローチはクエリパフォーマンスを大幅に向上させ、データベース負荷を軽減します。データベースにアクセスすることなく、キャッシュされたデータに対してLINQクエリを直接実行できます。
using (var context = new NorthwindContext())
{
var result = context.Customers
.Where(b => (b.CompanyName.Contains("Alfreds Futterkist")))
.FromCacheOnly()
}
NCache 開発者がアプリケーションの要件に基づいてキャッシュの動作をカスタマイズできるキャッシュ オプションを提供します。これにより、データ ストレージをより適切に制御し、有効期限ポリシーを設定し、自動無効化のための SQL 依存関係の追跡を有効にし、効率的な取得のためにキャッシュにデータを保存する方法を定義できるようになります。
var options = new CachingOptions
{
QueryIdentifier = "CustomerEntity",
CreateDbDependency = true,
StoreAs = StoreAs.SeperateEntities,
Priority = Runtime.CacheItemPriority.High
};
options.SetAbsoluteExpiration(DateTime.Now.AddSeconds(20));
NCache キャッシュの使用状況を追跡し、パフォーマンスメトリックを測定し、潜在的な問題をリアルタイムで検出するためのログ記録および監視機能が組み込まれています。Microsoft.Extensions.Loggingとシームレスに統合されているため、開発者はキャッシュの動作を分析し、問題をトラブルシューティングし、パフォーマンスを効率的に最適化できます。
Install-Package EntityFrameworkCore.NCache
public partial class NorthwindContext : DbContext
{
...
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Parameters specified in App.config
string cacheId = ConfigurationManager.AppSettings["CacheId"];
string connString = ConfigurationManager.AppSettings["ConnString"];
bool errorEnabled = bool.Parse(ConfigurationManager.AppSettings["ErrorEnabled"]);
int bulkInsertChunkSize = Int32.Parse(ConfigurationManager.AppSettings["BulkInsertChunkSize"]);
// Configure cache with connection retries and security
var options = new CacheConnectionOptions();
options.RetryInterval = TimeSpan.FromSeconds(3);
options.ConnectionRetries = 2;
options.ServerList = new List<ServerInfo>()
{
new ServerInfo("20.200.20.XX", 9800)
};
// Configure cache with security
options.UserCredentials = new Credentials("john_smith", "12345");
NCacheConfiguration.Configure(cacheId, DependencyType.SqlServer, options, errorEnabled, bulkInsertChunkSize);
optionsBuilder.UseSqlServer(connString);
}
}
©著作権 Alachisoft 2002 - . All rights reserved. NCache はダイヤテック株式会社の登録商標です。