【发布时间】:2020-02-28 13:32:37
【问题描述】:
我们正在使用简单的Memory Cache 来缓存密集查询的响应,否则每秒会被多次命中。缓存非常快,偏移量设置为 2 秒。
public StateService
{
private readonly ObjectCache _cache = MemoryCache.Default;
private const string _queueStatesCacheKey = "_states";
public IList<States> GetStates()
{
var states = _cache.Get(_statesCacheKey);
if (states== null)
{
states = getStatesFromDatabase();
_cache.Set(_statesCacheKey, states, DateTimeOffset.Now.AddSeconds(Settings.AppSettings.QueueStateCacheExpiration));
}
return states as List<States>;
}
}
方法:getStatesFromDatabase() 只需运行 SQL-query 即可运行存储过程并获取这些值。
这都是通过API 获取的,目前我们遇到的情况是缓存被清除,getStatesFromDatabase() 同时被 4-5 个线程访问。
- 我可以将
GetStates()包装在Task中,然后等到它完成后再让另一个请求启动一个新任务吗? - 或者我是否必须将其设为单例服务才能正常工作?
- 或者我是否必须创建一种新的提供程序来处理返回
List<States>? - 以不同的方式缓存它还是在其他地方缓存更好?
【问题讨论】:
标签: c# sql asp.net caching asp.net-web-api