如果我通过赋值来插入Cache:
Cache [“key”] = value;
什么是到期时间?
从缓存中删除相同的值:
我想通过if(Cache["key"]!=null)
检查该值是否在缓存中,是否最好将其从缓存中移除Cache.Remove("key")
或Cache["key"]=null
?
- 编辑 -
尝试Cache.Remove
和Cache["key"]=null
后,请勿使用Cache["key"]=null
,因为在压力下使用时会抛出异常。
答案 0 :(得分:11)
1 Cache["key"] = value
等于Cache.Insert("key", value)
MSDN Cache.Insert - method (String, Object):
此方法将覆盖现有的 密钥与密钥匹配的缓存项 参数。该对象添加到 缓存使用此重载 插入的插入方法没有文件 或缓存依赖关系,优先级 默认值,滑动到期值 NoSlidingExpiration,绝对 到期值 NoAbsoluteExpiration。
2最好通过Cache.Remove(“key”)从缓存中删除值。
如果您使用Cache["key"] = null
,则等于Cache.Insert("key", null)
。
看一下Cache.Insert
实现:
public void Insert(string key, object value)
{
this._cacheInternal.DoInsert(true, key, value, null, NoAbsoluteExpiration, NoSlidingExpiration, CacheItemPriority.Normal, null, true);
}
和CacheInternal.DoInsert
:
internal object DoInsert(bool isPublic, string key, object value, CacheDependency dependencies, DateTime utcAbsoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback, bool replace)
{
using (dependencies)
{
object obj2;
CacheEntry cacheKey = new CacheEntry(key, value, dependencies, onRemoveCallback, utcAbsoluteExpiration, slidingExpiration, priority, isPublic);
cacheKey = this.UpdateCache(cacheKey, cacheKey, replace, CacheItemRemovedReason.Removed, out obj2);
if (cacheKey != null)
{
return cacheKey.Value;
}
return null;
}
}
将其与Cache.Remove
:
public object Remove(string key)
{
CacheKey cacheKey = new CacheKey(key, true);
return this._cacheInternal.DoRemove(cacheKey, CacheItemRemovedReason.Removed);
}
CacheInternal.DoRemove
:
internal object DoRemove(CacheKey cacheKey, CacheItemRemovedReason reason)
{
object obj2;
this.UpdateCache(cacheKey, null, true, reason, out obj2);
return obj2;
}
最后Cache.Remove("key")
比Cache["key"] = null
答案 1 :(得分:3)
使用The add an item to the cache with expiration policies将其添加到缓存中以指定确切的时间范围 至于默认值,请参阅ASP.NET Caching: Techniques and Best Practices - 标题为在缓存中存储数据的部分指定:
Cache [“key”] =“value”;
这会将项目存储在缓存中 没有任何依赖,所以它会 除非缓存引擎,否则不会过期 删除它以便腾出空间 其他缓存数据。
当缓存占用一个对象时 - Null是一个对象!如果您想要一个值为null的条目,请使用Cache["key"]=null
如果您不想使用名称“key”进行输入,请使用Cache.Remove("key")
答案 2 :(得分:2)
如果未指定到期时间NoSlidingExpiration
,则设置NoAbsoluteExpiration
,NoAbsoluteExpiration是最大可能的DateTimeValue。因此它永远留在那里直到它被删除
更好地删除缓存
答案 3 :(得分:0)
我认为默认情况下没有默认的缓存到期时间,所以我相信它一直存在,直到应用程序池回收。
这是我知道检查缓存中是否存在某个项目的唯一方法