我有一个.Net应用程序和一个WCF服务,我用它来按时间顺序使用SortedSet
来缓存项目。它存储了一些我用来检索DatabaseId的元数据,因此对Db的查询会更加快速。我需要有关最佳/最佳/最合适架构的帮助。
服务在单例中保存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进行搜索。它还允许我使用MemCached来存储数据,从而进一步减少数据库访问。这是更高的目的。此外,我需要扩展Web服务器,这就是为什么我将它从Runtime.Cache移到外部的东西。
我并不是100%确定我真的需要这种缓存,但是当我直接查询数据库时,即使使用正确的索引,也会有更大的延迟。使用此方法,WCF搜索返回大约20ms的结果(大约1,000,000条记录),db查询将非常快(无法调用时间)。我也很厌倦随着使用量开始攀升,这个WCF无法扩展。
另外,我确实考虑过将整个SortedList存储到Cache中,但是转换为/ from / constant的添加使得它相当慢。
我希望行数增加至少10,000 /天,并且可以通过其他WCF方法随时添加记录。
也许我所做的完全错了,但我想到的一些事情是:
想法?
答案 0 :(得分:0)
您可以使用我在此处的自定义缓存:http://www.itsalltechnical.com/2011/01/non-web-expiring-generic-cache-in-c.html
我提到这一点是因为如果你不喜欢字典样式访问,你可以自定义检索数据的方式。我认为在大多数缓存结构中你会看到相同的字典方法,所以你可能会被逼到那里。你可以考虑使用一些其他类型的基于高速对象的持久性,如MongoDB或Cassandra(适用于facebook)的吞吐量。幸运的是,你有很多选择。