我使用MemoryCache类创建了一个缓存.我添加了一些项目,但是当我需要重新加载缓存时,我想首先清除它.最快的方法是什么?我应该遍历所有项目并一次删除一个项目还是有更好的方法?
我正在使用提供的缓存System.Runtime.Caching.MemoryCache.
我想枚举缓存的项目,以便我可以无效(逐出然后重新加载)项目
foreach (var item in MemoryCache.Default) { item.invalidate() }
Run Code Online (Sandbox Code Playgroud)
但这里发现的官方文件说:
!重要:检索MemoryCache实例的枚举器是一项资源密集型和阻塞操作.因此,不应在生产应用程序中使用枚举器.
当然必须有一种简单有效的方法来迭代缓存的项目?
我们假设我有以下代码:
IEnumerable<string> allKeys = _cache.Select(o => o.Key);
Parallel.ForEach(allKeys, key => _cache.Remove(key));
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在检索所有密钥_cache,将它们存储在我的本地变量中allKeys,然后同时从中删除所有密钥_cache.
但是,我想要做一行.所以我想到的是:
Parallel.ForEach(_cache.Select(o => o.Key), key => _cache.Remove(key));
Run Code Online (Sandbox Code Playgroud)
但是_cache.Select(o => o.Key)每次循环迭代都会调用该语句,因此每次都会检索不同数量的元素(因为我正在同时删除它们).
后一行代码是否安全?
是否_cache.Select(o => o.Key)在循环语句,只被调用一次,然后每一次迭代使用原来的结果,抑或是在每个迭代步骤处理?
乍一看,这似乎是该问题的重复,但是我没有问如何清除EF的缓存。
如何清除IMemoryCache接口设置的整个缓存?
public CacheService(IMemoryCache memoryCache)
{
this._memoryCache = memoryCache;
}
public async Task<List<string>> GetCacheItem()
{
if (!this._memoryCache.TryGetValue("Something", out List<string> list))
{
list= await this ...
this._memoryCache.Set("Something", list, new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.NeverRemove));
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
这只是一个例子。我有许多类/方法正在存储要缓存的值。现在,我需要将其全部删除。
在某些情况下,我的密钥是动态创建的,因此我不知道需要删除哪些密钥。清除将是完美的。
我可以编写自己的接口和类以供内部使用IMemoryCache,但这似乎有些过分。有没有更简单的选择?