asp.net-core
キャッシング
サーチ…
前書き
キャッシングは、簡単にアクセス可能なデータのコピーを維持することによって、アプリケーションのパフォーマンスを向上させるのに役立ちます。 Aspnet Coreには使いやすい2つのキャッシング抽象クラスが用意されています。
メモリキャッシュは、ローカルサーバーのメモリキャッシュにデータを格納します。
分散キャッシュは、クラスタ内のサーバーがアクセスできる中央の場所にデータキャッシュを保持します。それは、3つの実装、つまり、メモリ(ユニットテストとローカル開発者用)、RedisとSql Serverで実装されています。
ASP.NETコアアプリケーションでのInMemoryキャッシュの使用
ASP.NETアプリケーションでメモリ内キャッシュを使用するには、 project.json
ファイルに次の依存関係を追加します。
"Microsoft.Extensions.Caching.Memory": "1.0.0-rc2-final",
StartupクラスのConfigureServicesメソッドにキャッシュサービス(Microsoft.Extensions.Caching.Memory)を追加します。
services.AddMemoryCache();
アプリケーションのキャッシュに項目を追加するには、以下に示すように任意のクラス(たとえばController)に注入できるIMemoryCache
を使用します。
private IMemoryCache _memoryCache;
public HomeController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
Getは値が存在する場合はそれを返しnull
が、そうでない場合はnull
返しnull
。
// try to get the cached item; null if not found
// greeting = _memoryCache.Get(cacheKey) as string;
// alternately, TryGet returns true if the cache entry was found
if(!_memoryCache.TryGetValue(cacheKey, out greeting))
キャッシュに書き込むには、 Setメソッドを使用します。 Setは、値を参照するために使用するキー、キャッシュされる値、およびMemoryCacheEntryOptions
セットをMemoryCacheEntryOptions
ます。 MemoryCacheEntryOptions
使用すると、絶対時間またはスライド時間ベースのキャッシュ有効期限、キャッシュの優先順位、コールバック、および依存関係を指定できます。以下のサンプルの1つは、
_memoryCache.Set(cacheKey, greeting,
new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(1)));
分散キャッシング
分散キャッシュを活用するには、使用可能な実装の1つを参照する必要があります。
たとえば、Redis実装を次のように登録します。
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedRedisCache(options =>
{
options.Configuration = "ServerAdress";
options.InstanceName = "InstanceName";
});
}
必要なIDistributedCache
依存関係が必要です。
public class BooksController { private IDistributedCache distributedCache; public BooksController(IDistributedCache distributedCache) { this.distributedCache = distributedCache; } [HttpGet] public async Task<Books[]> GetAllBooks() { var serialized = this.distributedCache.GetStringAsync($"allbooks"); Books[] books = null; if (string.IsNullOrEmpty(serialized)) { books = await Books.FetchAllAsync(); this.distributedCache.SetStringAsync($"allbooks", JsonConvert.SerializeObject(books)); } else { books = JsonConvert.DeserializeObject<Books[]>(serialized); } return books; } }