私は偉大な約AsyncLock libraryを読んでいますが、いくつか質問があります。リンクからasp.netキャッシュキーごとに適切な非同期ロック
例は、次のコード行があります。
private readonly AsyncLock _mutex = new AsyncLock();
public async Task DoStuffAsync()
{
using (await _mutex.LockAsync())
{
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
は、私は私のASP.NETコントローラでこのコードを再利用しようとしたが、私はいくつかの疑問を持っています。上記
シナリオは、キャッシュキーが常に同じであるbacicロックをカバーしていますが、どのように私は、以下の例のように動的キャッシュを持っている、と私はArticleId1
ロックにユーザーのロードArticleId2
を望んでいないならばについて。 各キャッシュキーには自分自身のAsyncLock _mutex
が必要ですか?
また、複数のユーザーがロックを共有するという事実のため、mutexを静的に変換する権限を持っていますか?
private static readonly AsyncLock _mutexIndex = new AsyncLock();
public async Task<IActionResult> Index(int articleId)
{
var key = CacheKeysFor.Article.ById(articleId);
ArticleModel cacheEntry;
cacheEntry = _cache.Get<ArticleModel>(key);
if (cacheEntry == null)
{
using (await _mutexIndex.LockAsync())
{
if (cacheEntry == null)
{
cacheEntry = SomeDatabaseCall
_cache.Set(key, cacheEntry, TimeSpan.FromSeconds(60));
}
}
}
return View(cacheEntry);
}
「_cache」とは何ですか?それはMemoryCacheですか? – Evk
@EvkこれはMemoryCacheですが、依存性注入によって切り替えると容易にRedisになる可能性があります。 – Robert