나는 약 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 컨트롤러에서이 코드를 재사용하려고 노력을하지만, 나는 몇 가지 의문이있다.
위에서 언급 한 시나리오는 캐시 키가 항상 같은 바 식 잠금을 다루지 만 아래 예처럼 동적 캐시가있는 경우에는 어떻습니까? 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