Tag: memorycache

MemoryCache线程安全,locking是必要的?

对于初学者,让我把它扔出去,我知道下面的代码是不是线程安全的(更正:可能)。 我所苦苦挣扎的是find一个实现,一个实际上我可以在testing中失败的实现。 我正在重构一个大的WCF项目,它需要一些(大部分)静态数据caching,并从SQL数据库填充它。 它需要过期,至less每天“刷新”一次,这就是为什么我使用MemoryCache。 我知道,下面的代码不应该是线程安全的,但我不能让它在重负载下失败,并使谷歌search显示实现两个方面的事情复杂化(有和没有锁结合辩论,无论它们是否有必要。 是否可以在multithreading环境中使用MemoryCache的知识,让我明确知道是否需要在适当的位置locking,以便在检索/重新填充期间移除调用(很less被调用但是它的一个要求)不会被抛出。 public class MemoryCacheService : IMemoryCacheService { private const string PunctuationMapCacheKey = "punctuationMaps"; private static readonly ObjectCache Cache; private readonly IAdoNet _adoNet; static MemoryCacheService() { Cache = MemoryCache.Default; } public MemoryCacheService(IAdoNet adoNet) { _adoNet = adoNet; } public void ClearPunctuationMaps() { Cache.Remove(PunctuationMapCacheKey); } public IEnumerable GetPunctuationMaps() { if (Cache.Contains(PunctuationMapCacheKey)) { […]

如何处理使用MemoryCache的代价高昂的build筑操作?

在ASP.NET MVC项目中,我们有几个需要大量资源和时间构build的数据实例。 我们想caching它们。 MemoryCache提供一定程度的线程安全性,但不足以避免并行运行多个构build代码实例。 这里是一个例子: var data = cache["key"]; if(data == null) { data = buildDataUsingGoodAmountOfResources(); cache["key"] = data; } 正如您在繁忙的网站上看到的,数百个线程可能会同时进入if语句,直到数据build立,并使build设操作更慢,不必要地占用服务器资源。 在MemoryCache中有一个primefacesAddOrGetExisting实现,但它错误地要求“设置值”而不是“代码来检索设置的值”,我认为呈现给定的方法几乎完全无用。 我们一直在使用我们自己的专用脚手架来绕过MemoryCache,但是它需要明确的lock 。 使用per-entry锁对象很麻烦,我们通常通过共享远离理想的锁对象而逃脱。 这使我认为避免这种惯例的理由可能是有意的。 所以我有两个问题: 不lockbuild筑物代码是否更好? (这可能已经被certificate对一个更加敏感,我想知道) 什么是正确的方式来实现每个条目lockingMemoryCache这样的锁? 在“.NETlocking101”中,强烈要求使用keystring作为locking对象。

使用多个MemoryCache实例

我想使用System.Runtime.Caching命名空间将cachingfunction添加到我的应用程序,并且可能要在几个地方和不同的上下文中使用caching。 为此,我想使用几个MemoryCache实例。 不过,我在这里看到,使用MemoryCache的多个实例是不鼓励的: MemoryCache不是一个单例,但是应该只创buildless数或者可能只有一个MemoryCache实例,并且caching项的代码应该使用这些实例。 多个MemoryCache实例如何影响我的应用程序? 我觉得这种奇怪,因为在我看来,在一个应用程序中使用多个caching是一个相当普遍的情况。 编辑:更具体地说,我有一个类应该保持每个实例的caching。 我应该避免使用MemoryCache并寻找不同的caching解决scheme吗? 在这种情况下使用MemoryCache被认为是不好的,如果是的话,为什么呢?

MemoryCache.Add和MemoryCache.Set有什么区别?

我读了MSDN文档,但并没有真正理解它。 我相信Set的行为是“replace现有的,或添加”(primefaces)。 那是对的吗?

MemoryCache在configuration中不遵守内存限制

我在应用程序中使用.NET 4.0 MemoryCache类,试图限制最大caching大小,但是在我的testing中,并没有显示caching实际上服从的是限制。 我正在使用根据MSDN ,应该限制caching大小的设置: CacheMemoryLimitMegabytes :对象实例可以增长到的最大内存大小(以兆字节为单位)。 PhysicalMemoryLimitPercentage : “高速caching可使用的物理内存百分比,表示为1到100之间的整数值。默认值为零,表示MemoryCache实例根据安装在内存中的内存量pipe理其自己的内存1电脑。” 1.这是不完全正确的 – 低于4的任何值都被忽略,并被replace为4。 我知道这些值是近似的而不是硬限制,因为清除caching的线程每隔x秒触发一次,并且也取决于轮询间隔和其他未公开的variables。 但是,即使考虑到这些差异,在将CacheMemoryLimitMegabytes和PhysicalMemoryLimitPercentage设置在一起或在testing应用程序中单独设置时,第一个项目将从caching中逐出时,会看到极其不一致的caching大小。 为了确保我跑了10次testing,并计算出平均数字。 这些是在具有3GB RAM的32位Windows 7 PC上testing以下示例代码的结果。 caching的大小是在每次testing首次调用CacheItemRemoved()之后进行的。 (我知道caching的实际大小会比这大) MemLimitMB MemLimitPct AVG Cache MB on first expiry 1 NA 84 2 NA 84 3 NA 84 6 NA 84 NA 1 84 NA 4 84 NA 10 84 10 20 81 10 […]

locking模式以正确使用.NET MemoryCache

我假设这个代码有并发问题: const string CacheKey = "CacheKey"; static string GetCachedData() { string expensiveString =null; if (MemoryCache.Default.Contains(CacheKey)) { expensiveString = MemoryCache.Default[CacheKey] as string; } else { CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(20)) }; expensiveString = SomeHeavyAndExpensiveCalculation(); MemoryCache.Default.Set(CacheKey, expensiveString, cip); } return expensiveString; } 并发问题的原因是多个线程可以获得空密钥,然后尝试将数据插入caching。 什么是最短和最干净的方式来使这个代码并发certificate? 我喜欢在caching相关代码中遵循一个良好的模式。 一个在线文章的链接将是一个很大的帮助。 更新: 我根据@Scott Chamberlain的回答提出了这个代码。 任何人都可以find任何性能或并发问题? 如果这样做,它会节省许多代码和错误。 using […]

如何清除MemoryCache?

我已经使用MemoryCache类创build了一个caching。 我添加一些项目,但是当我需要重新加载caching我想先清除它。 什么是最快的方法来做到这一点? 我应该循环所有的项目,并一次删除一个或有更好的办法吗?

MemoryCache Empty:设置后返回null

我有一个使用新的.NET 4 System.Runtime.Caching MemoryCache的MVC 3应用程序的问题。 我注意到,在一个看似不可预测的时间之后,它停止了caching,而且是空的。 考虑一下我从ASP.NET MVC中的一个testing视图直接得到的代码: MemoryCache.Default.Set("myname","fred", new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0,5,0) }); Response.Write(MemoryCache.Default["myname"]); 当它工作时,可预测的“fred”被打印出来。 但是,当问题开始发生时,尽pipeSet() , MemoryCache.Default["myname"]值为null。 我可以通过在Response.Write()行上设置一个断点来certificate这一点,并使用立即窗口直接设置和读取caching – 它只是不会设置它,并保持空! 唯一能让它再次运行的方法是导致AppDomain重复使用。 有趣的是,当应用程序正常工作时,可以通过打破Response.Write()行并运行MemoryCache.Default.Dispose()来激发问题。 之后,MemoryCache.Default本身不是空(为什么是这样?),但不会保存任何设置。 它不会导致任何错误,但不会保存任何内容。 有人可以validation这个并解释吗? 正如我相信我已经发现,当应用程序停止自己的工作, 一些是处置MemoryCache.Default ,但它不是我! UPDATE 那么,我现在已经厌倦了这个问题! CLRProfiler似乎不适用于MVC 3. SciTech的CLR工具很好 – RedGate ANTS也是如此。 但他们告诉我的是,MemoryCache对象正在被某种东西处置! 我也certificate了(通过打印时间戳)我的页面上的PartialView应该被caching(由OutputCacheAttribute指定)在几分钟后不会被caching – 它会在每次调用页面时开始刷新。 为了澄清环境,我直接运行在运行Win 7 Ultimate的开发工作站上的IIS 7.5服务器上。 上面提到的内存工具提示我只用了大约9mb的内存。 无奈之下,我已经改变了我的caching代码,首先search环境HttpContext挂钩并使用其cachingfunction,如果可用的话。 早期的testing显示这是可靠的,但感觉像一个讨厌的黑客。 我感觉到MemoryCache和OutputCache不能保证与MVC 3一起工作…