问题描述
如何防止将特定项目添加到缓存。就我而言,我正在考虑防止将null返回值添加到缓存中。这是我目前正在做的事情:
Func<long?> internalGetRecordUri =() =>
{
//it can return null here
};
long? output;
lock (_lock)
{
output = _cache.GetorAdd(
"GetRecordUri" + applicationId,internalGetRecordUri,new TimeSpan(1,0));
if (output == null)
{
_cache.Remove("GetRecordUri" + applicationId);
}
}
我确信有更好的方法,因为这种方式实现锁首先会破坏使用LazyCache的目的。
解决方法
您可以使用 MemoryCacheEntryOptions 回调生成缓存项并将到期日期设置为过去(如果为空)来实现此目的:
output = _cache.GetOrAdd(
"GetRecordUri" + 123,entry => {
var record = internalGetRecordUri();
if(record == null)
// expire immediately
entry.AbsoluteExpirationRelativeToNow = new TimeSpan(-1,0);
else
entry.AbsoluteExpirationRelativeToNow = new TimeSpan(1,0);
return record;
});