我有一个.Net应用程序和一个WCF服务,我使用SortedSet
按时间顺序缓存项目。它存储了一些用于检索DatabaseId的元数据,因此查询到Db的速度会更快。我需要最佳/正确/最合适的架构方面的帮助。Web应用程序 - 缓存体系结构
该服务包含一个单例中的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,并发现它们不可用,因为它们将项存储在键/值中。也许我错了,但可以使用这些产品,如果是这样的话?如果没有,我还可以使用其他什么方式来存储顺序数据(按日期)以获得匹配的DatabaseIds?
更新
的原因我为什么我这样做的是通过数据库搜索,直接是相当缓慢的,并且获得存储在数据库中的项目并不总是按时间顺序排列。如果我只能传入DatabaseId,数据库只需要在PK上查找。它也允许我使用MemCached来存储数据,进一步最小化数据库访问。这是更高的目的。另外,我需要Web服务器进行扩展,这就是为什么我将它从Runtime.Cache移出到外部的原因。
我不是100%确定我确实需要这种缓存,但是当我直接查询数据库时,即使正确安装了索引,也会有更大的延迟。使用这种方法,WCF搜索返回约20ms的结果(大约有1,000,000条记录),并且数据库查询会非常快(无法记住时间)。我也厌倦了,随着使用量的增加,这个WCF不会扩展。另外,我的确在考虑将整个SortedList存储到缓存中,但是从/添加/常量添加使得它非常缓慢。
我预计行数至少增加10,000个/天,并且记录通过另一个WCF方法随时添加。
也许我所做的是完全错误的,但我已经想到了几件事情:
- 在数据库中创建新表,用于存储正是因为我有在缓存中。这将由CreateDate和高度索引
- 继续尝试优化查询/数据库,以便查询将更快
- 保留WCF服务,但已创建一个新的ExpiryDate字段,并有该记录到期,这种方式不使用的旧东西不会徘徊。
想法??
你能解释这个更高层次的目的吗?即没有缓存,这应该怎么做? – 2011-04-28 14:58:52
是什么阻止您将整个列表存储为单个对象?您可以将其重新转换为其类型,然后重试。 – 2011-04-28 15:00:14
我认为这可能是一个有趣的问题,但我与戴夫在一起,最终的结果/目的并不完全清楚。 – 2011-04-28 15:13:58