3

我正在评估 NCache 在正在进行的项目中作为“通读”缓存的用途 - 以减轻 SQL 服务器的负载。
在客户端,该项目有一个轮询例程,用于接收按上次轮询日期时间过滤的项目(在服务器端)。
轮询以固定间隔在单独的线程中发生。
客户端的伪代码
1)第一次获取:

  1. 获取所有现有项目
  2. LastHandledDate设置为现在

2)非首次获取(轮询线程)

  1. 获取在LastHandledDate之后创建的现有项目
  2. 将 LastHandledDate更新为现在

在服务器端,当接收到轮询查询时,会执行以下伪代码:

  1. 查询 NCache 以获取CreationDate >= LastHandledDate的所有匹配项
  2. IF 查询结果为空
    1. 查询 SQL 数据库以获取CreationDate >= LastHandledDate的所有匹配项
    2. 如果查询不为空,则使用 SQL 查询结果更新 NCache
    3. 返回 SQL 查询结果
  3. 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?
4

1 回答 1

1

尝试为您的课程使用查询索引

我在缓存中使用了 100k 个项目(每个项目大小约为 250kb)并且没有任何性能问题。

于 2013-07-31T15:56:43.513 回答