我们有一个类似的 REST API 方法:
List<item> GetItems(int AccountID)
{
var x = getFromCache(AccountID);
if(x==null)
{
x = getFromDatabase(AccountID);
addToCache(AccountID, x);
}
return x;
}
对于一些复杂的数据库调用,这是一种相当昂贵的方法,我们有一种常见的情况,数百名具有相同 AccountId 的用户几乎同时进行调用(他们都被广播通知)。
在该方法中,我们将结果集缓存 10 秒,因为对于在该窗口内发出请求的每个人来说,接近时间的结果都很好。但是,由于他们都同时进行调用(同样,对于特定的 AccountID),缓存永远不会预先填充,因此每个人最终都会进行数据库调用。
所以我的问题是,在该方法中,如何暂停针对特定 accountId 的所有传入请求并让它们都等待第一个结果集完成,以便其余调用可以使用缓存的结果集?
我已经阅读了一些关于 Monitor.Pulse 和 Monitor.Lock 的内容,但是 per-accountId 锁的实现让我感到困惑。任何帮助将不胜感激。