Questions tagged «memorycache»

9
正确使用.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; } 并发问题的原因是多个线程可以获取空键,然后尝试将数据插入缓存。 进行此代码并发证明的最短,最干净的方法是什么?我喜欢在与缓存相关的代码中遵循良好的模式。链接到在线文章会很有帮助。 更新: 我根据@Scott Chamberlain的答案提出了此代码。有人能找到与此相关的任何性能或并发问题吗?如果可行,它将节省很多代码和错误。 …


11
如何清除MemoryCache?
我已经使用MemoryCache类创建了一个缓存。我向其中添加了一些项目,但是当我需要重新加载缓存时,我想先清除它。最快的方法是什么?我应该遍历所有项目并一次删除一个项目,还是有更好的方法?

7
MemoryCache线程安全,是否需要锁定?
首先,让我把它扔在那里,我知道下面的代码不是线程安全的(更正:可能)。我正在努力寻找的是一种实现,而我实际上可能在测试中失败。我现在正在重构一个大型WCF项目,该项目需要一些(主要是)静态数据进行缓存,并从SQL数据库中进行填充。它需要至少每天过期一次并“刷新”一次,这就是为什么我要使用MemoryCache。 我知道下面的代码不应该是线程安全的,但是我不能让它在重负载下失败,而且使Google搜索显示两种实现方式的问题复杂化(带锁和不带锁以及是否有必要进行辩论的结合)。 能够在多线程环境中拥有MemoryCache知识的人可以让我确切地知道是否需要在适当的地方锁定,以便在检索/重新填充期间不会引发对remove的调用(很少调用,但这是必需的)。 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 …

7
MemoryCache不遵循配置中的内存限制
我正在使用应用程序中的.NET 4.0 MemoryCache类,并试图限制最大缓存大小,但是在我的测试中,似乎没有缓存实际上在遵守限制。 根据MSDN,我使用的设置应该限制​​缓存大小: CacheMemoryLimitMegabytes:对象实例可以增长到的最大内存大小(以兆字节为单位)。” PhysicalMemoryLimitPercentage: “高速缓存可以使用的物理内存的百分比,表示为1到100之间的整数。默认值为零,这表示MemoryCache实例根据安装在其上的内存量来管理自己的内存1。电脑。” 1.这并不完全正确-低于4的任何值都将被忽略并替换为4。 我知道这些值是近似值,而不是硬性限制,因为清除缓存的线程每x秒触发一次,并且还取决于轮询间隔和其他未记录的变量。但是,即使考虑到这些差异,当在测试应用程序中将CacheMemoryLimitMegabytes 和PhysicalMemoryLimitPercentage一起设置或单独设置后,从缓存中逐出第一项时,我仍然看到非常不一致的缓存大小。为了确保我每次测试都跑了10次并计算出平均值。 这些是在具有3GB RAM的32位Windows 7 PC上测试以下示例代码的结果。在第一次调用CacheItemRemoved()之后获取缓存的大小在每个测试。(我知道缓存的实际大小会大于此大小) 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 30 81 10 …
87 c#  .net  caching  memorycache 

2
使用多个MemoryCache实例
我想使用System.Runtime.Caching名称空间向我的应用程序添加缓存功能,并且可能要在多个地方和不同的上下文中使用缓存。为此,我想使用几个MemoryCache实例。 但是,我在这里建议不要使用多个以上的MemoryCache实例: MemoryCache不是单例,但是您应该仅创建几个或可能仅创建一个MemoryCache实例,并且用于缓存项目的代码应使用这些实例。 多个MemoryCache实例将如何影响我的应用程序?我觉得这很奇怪,因为在我看来,在应用程序中使用多个缓存是很常见的情况。 编辑:更具体地说,我有一个应该为每个实例保留缓存的类。我应该避免使用MemoryCache并寻找其他缓存解决方案吗?MemoryCache在这种情况下使用是否被认为是不好的?如果是,为什么?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.