2017-04-02 77 views
1

当需要在内存中缓存文件,假定了以下行动:内存缓存和并发的问题

public IActionResult Article(int id) { 
    String content = MemoryCache.Get<String>(id.ToString()); 

    if(content == null) { 
     MemoryCache.Set<String>(id.ToString(), ReadFile(id), new MemoryCacheEntryOptions() { 
       AbsoluteExpiration = DateTime.Now.AddHours(1) 
     }); 

     content = MemoryCache.Get<String>(id.ToString()); 
    } 

    return View(content); 
} 

如果两个或更多的请求命中服务器在同一时间会发生什么?这会导致文件被多次读取和缓存,或者ASP.Net Core MVC默认处理这个问题?如果是这样,锁定缓存块是否安全?

回答

0

MemoryCache是​​“线程安全”,但这并不意味着两个进程不能同时错过缓存(而第一个缓存正在生成缓存)。

现在使用锁定,这实际上取决于生成缓存的函数有多沉重,并将其与您的代码中的锁有多沉重比较。

两个线程多久会进来寻找相同的缓存值?如果答案不经常,那么如果大多数情况下实际上不需要,可能不值得增加锁的开销。

+0

我已经想通了,答案是“是的确会导致问题”,因为Get或Set方法不是线程安全的。另一方面,'GetOrAdd'或'AddOrUpdate'方法是线程安全的,我可以使用。 – Arrrr