0

我们正在使用 Enterprise Library 5 和它在我们的 Web 应用程序中提供的 CacheManager。在我们开始对应用程序进行重负载测试之前,一切似乎都运行良好。

我们使用基于 ID 的密钥缓存数据库中的记录。我们并不是一直从缓存中请求一个项目,有时我们需要从缓存中获取项目列表。为此,我们有一个 LINQ 查询,它生成一个 Select(e => CacheManager.GetData(id_from_list)) 并从缓存中返回项目列表。大多数情况下,这工作正常,但在重负载时,GetData 方法成为瓶颈,因为缓存管理器对缓存的读取和写入操作都执行锁定。基本上一次只有一个线程可以从缓存中读取数据。

其他人是否遇到过同样的问题,您是否找到了解决此问题的方法?

注意:我们尝试实际缓存项目列表并根据列表中项目的 id 组合键。这实际上解决了问题,并且 cachemanager.getdata 不再是瓶颈......但是......显然这不是一个好的解决方案,因为我们可以在很多列表中的缓存中拥有数千次的每个项目。

4

1 回答 1

1

您可以考虑调整 CacheManager 以使用读/写锁(我认为它更适合这种情况)而不是它现在使用的排他锁。

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx

基本上,当多个读取器线程需要同时访问数据时,读/写锁是合适的,并且只有发生写入才会导致传入的读取器阻塞。

然而,这些在负载下还有其他问题,例如写饥饿。根据读/写锁的实现,写入将始终等待所有读取首先完成 - 使用恒定的读取流,写入将永远没有机会发生。

于 2012-07-26T18:39:31.697 回答