如何清除内存缓存?
我使用 MemoryCache 类创建了一个缓存。我向其中添加了一些项目,但是当我需要重新加载缓存时,我想先清除它。最快的方法是什么?我应该遍历所有项目并一次删除它们还是有更好的方法?
I have created a cache using the MemoryCache class. I add some items to it but when I need to reload the cache I want to clear it first. What is the quickest way to do this? Should I loop through all the items and remove them one at a time or is there a better way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
处置
现有的MemoryCache 并创建一个新的MemoryCache 对象。Dispose
the existing MemoryCache and create a new MemoryCache object.枚举问题
MemoryCache.GetEnumerator() 备注部分警告:“检索 MemoryCache 实例的枚举器是一项资源密集型且阻塞的操作,因此不应在生产应用程序中使用枚举器。”
原因如下,在 GetEnumerator() 实现的伪代码中进行了解释:
由于该实现将缓存划分为多个 Dictionary 对象,因此它必须将所有内容合并到一个集合中,以便交回枚举器。每次调用 GetEnumerator 都会执行上面详述的完整复制过程。新创建的字典包含对原始内部键和值对象的引用,因此实际缓存的数据值不会重复。
文档中的警告是正确的。避免 GetEnumerator() —— 包括上面使用 LINQ 查询的所有答案。
更好、更灵活的解决方案
这是一种清除缓存的有效方法,它仅构建在现有的更改监视基础结构之上。它还提供了清除整个缓存或仅清除指定子集的灵活性,并且不存在上述问题。
The problem with enumeration
The MemoryCache.GetEnumerator() Remarks section warns: "Retrieving an enumerator for a MemoryCache instance is a resource-intensive and blocking operation. Therefore, the enumerator should not be used in production applications."
Here's why, explained in pseudocode of the GetEnumerator() implementation:
Since the implementation splits the cache across multiple Dictionary objects, it must bring everything together into a single collection in order to hand back an enumerator. Every call to GetEnumerator executes the full copy process detailed above. The newly created Dictionary contains references to the original internal key and value objects, so your actual cached data values are not duplicated.
The warning in the documentation is correct. Avoid GetEnumerator() -- including all of the answers above that use LINQ queries.
A better and more flexible solution
Here's an efficient way of clearing the cache that simply builds on the existing change monitoring infrastructure. It also provides the flexibility to clear either the entire cache or just a named subset and has none of the problems discussed above.
来自http://connect.microsoft。 com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
解决方法是:
From http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
The workaround is:
如果性能不是问题,那么这个漂亮的单行代码就可以解决问题:
If performance isn't an issue then this nice one-liner will do the trick:
似乎有一个 修剪方法。
因此,要清除所有内容,您只需
编辑:
经过更多挖掘后,似乎不值得花时间研究 Trim
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
如何清除 System.Runtime.Caching.MemoryCache
It seems that there is a Trim method.
So to clear all contents you'd just do
EDIT:
after digging some more, it seems that looking into Trim is not worth your time
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
How do I clear a System.Runtime.Caching.MemoryCache
遇到了这个,并基于它,写了一个稍微更有效的并行清除方法:
Ran across this, and based on it, wrote a slightly more effective, parallel clear method:
你也可以这样做:
You could also do something like this:
您可以处置 MemoryCache.Default 缓存,然后将私有字段单例重新设置为 null,以使其重新创建 MemoryCache.Default。
You can dispose the MemoryCache.Default cache and then re-set the private field singleton to null, to make it recreate the MemoryCache.Default.
我只对清除缓存感兴趣,并在使用 c# GlobalCachingProvider 时发现这是一个选项
I was only interested in clearing the cache and found this as an option, when using the c# GlobalCachingProvider
我使用 IMemeryCache 在我的控制器中添加 DI 容器,并使用此代码来清除缓存:
它对我有用。
I use IMomeryCache that add with DI container in my controller and I use this code for clear cache:
its worked for me.
马格利特答案的一点改进版本。
a bit improved version of magritte answer.
此讨论也在这里进行:
https://learn.microsoft.com/en-us/ answers/answers/983399/view.html
我在那里写了一个答案,我将在这里转录它:
This discussion is also being done here:
https://learn.microsoft.com/en-us/answers/answers/983399/view.html
I wrote an answer there and I'll transcribe it here: