我正在评估 NCache 在正在进行的项目中作为“通读”缓存的用途 - 以减轻 SQL 服务器的负载。
在客户端,该项目有一个轮询例程,用于接收按上次轮询日期时间过滤的项目(在服务器端)。
轮询以固定间隔在单独的线程中发生。
客户端的伪代码
1)第一次获取:
- 获取所有现有项目
- 将LastHandledDate设置为现在
2)非首次获取(轮询线程)
- 获取在LastHandledDate之后创建的现有项目
- 将 LastHandledDate更新为现在
在服务器端,当接收到轮询查询时,会执行以下伪代码:
- 查询 NCache 以获取CreationDate >= LastHandledDate的所有匹配项
- IF 查询结果为空
- 查询 SQL 数据库以获取CreationDate >= LastHandledDate的所有匹配项
- 如果查询不为空,则使用 SQL 查询结果更新 NCache
- 返回 SQL 查询结果
- ELSE 返回 NCache 查询结果
要查询 NCache,我使用的是它的 linq 提供程序,查询类似于 SQL 查询:
SELECT * FROM Messages WHERE Message.SessionId = 1234 AND Message.EntryDate >= ‘2012-10-6’
编辑:在测试期间,在客户端有一个线程以恒定速率添加新项目
服务器端部分托管在 Web 服务(IIS 中的 WCF)中。
在使用 100 个客户端对上述轮询设置进行了大约一个小时的负载测试后,我注意到 Web 服务正在执行的请求/秒稳步下降。
运行上面的设置,只从 NCache 读取,根本没有 SQL 读取(在服务器端伪代码中没有第2段)在请求/秒中产生了相同的下降模式。
我有几个问题:
- 似乎 NCache 的查询性能取决于缓存中的对象总数。类似解决方案(NoSQL / Distributed Cache)中是否存在这种情况
- 哪种 NoSQL/分布式缓存解决方案针对查询速度进行了优化?
- 也许在 NCache 中查询可以更优化?
- 也许我遗漏了一些东西——而且我的分布式缓存使用模式不正确——如何在我的用例中有效地使用分布式缓存,例如 NCache?