【发布时间】:2011-09-08 15:09:24
【问题描述】:
我有一个 .Net 应用程序和一个 WCF 服务,我使用 SortedSet 按时间顺序缓存项目。它存储了一些我用来检索 DatabaseId 的元数据,因此对 Db 的查询会更快。我需要有关最佳/正确/最合适架构的帮助。
Service 在单例中保存一个 SortedSet。存储的数据是
public class MyData : IComparable<MyData> {
DateTime CreateDate {get; set;}
List<int> AccountIds {get; set;}
long DatabaseId {get; set;}
// implementation to sort by CreateDate
}
我有一个有合同的方法
List<int> GetDatabaseIds( DateTime startRange, DateTime endRange,
List<int> accountIds )
然后,此方法将通过 SortedSet,使用 GetViewBetween(使用 CreateDate 字段),然后发出 LINQ 查询以仅返回与 AccountIds 匹配的 DatabaseIds。
这加快了数据库检索速度,但随着记录数量的增加,内存需求也会增加。我已经对 AppFabric Cache、MemCached 进行了试验,发现它们无法使用,因为它们将项目存储在 Key/Value 中。也许我错了,但是这些产品可以使用吗,如果可以,如何使用?如果没有,我可以使用哪些其他方式来存储顺序数据(按日期)以获取匹配的 DatabaseIds?
更新
我这样做的原因是直接搜索数据库相当慢,并且存储在数据库中的项目并不总是按时间顺序排列。如果我可以直接传入DatabaseId,那么数据库只需要在PK上做一个seek。它还允许我使用 MemCached 来存储数据,进一步减少数据库访问。这是更高的目的。此外,我需要 Web 服务器进行扩展,这就是为什么我将它从 Runtime.Cache 移到外部的原因。
我不能 100% 确定我真的需要这种缓存,但是当我直接查询数据库时,即使有正确的索引也会有更大的延迟。使用这种方法,WCF 搜索在大约 20 毫秒内返回结果(大约 1,000,000 条记录),并且 db 查询将非常快(无法回忆时间)。我也很担心随着使用量开始攀升,这个 WCF 无法扩展。
另外,我确实考虑过将整个 SortedList 存储到缓存中,但是转换为/从/常量添加使其相当慢。
我预计行数每天至少增加 10,000 行,并且可以随时通过另一种 WCF 方法添加记录。
也许我所做的是完全错误的,但我想到的一些事情是:
- 在 Db 中创建一个新表,该表与我在缓存中的存储完全一样。这将由 CreateDate 聚集并高度索引
- 继续尝试优化查询/数据库,以便查询更快
- 保留 WCF 服务,但创建一个新的 ExpiryDate 字段,并让该记录过期,这样旧的不使用的东西就不会挥之不去。
想法??
【问题讨论】:
-
你能解释一下这个更高层次的目的吗?即没有缓存,这应该怎么做?
-
是什么阻止您将整个列表存储为单个对象?您可以将其转换回其类型并重新检查。
-
我认为这可能是一个有趣的问题,但我和戴夫在一起,最终结果/目的并不完全清楚。
-
如果您不确定是否需要它,我建议您在使用现有数据库方面付出更多努力,而不是通过添加另一个组件(以及潜在的故障点/维护)。
-
@GrandmasterB - 我相信我很快就会将其删除,但我想知道其他人使用过什么的想法,看看什么最有效
标签: .net architecture data-structures caching