2011-04-28 52 views
1

我有一个.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方法随时添加。

也许我所做的是完全错误的,但我已经想到了几件事情:

  1. 在数据库中创建新表,用于存储正是因为我有在缓存中。这将由CreateDate和高度索引
  2. 继续尝试优化查询/数据库,以便查询将更快
  3. 保留WCF服务,但已创建一个新的ExpiryDate字段,并有该记录到期,这种方式不使用的旧东西不会徘徊。

想法??

+0

你能解释这个更高层次的目的吗?即没有缓存,这应该怎么做? – 2011-04-28 14:58:52

+0

是什么阻止您将整个列表存储为单个对象?您可以将其重新转换为其类型,然后重试。 – 2011-04-28 15:00:14

+0

我认为这可能是一个有趣的问题,但我与戴夫在一起,最终的结果/目的并不完全清楚。 – 2011-04-28 15:13:58

回答

0

你可以使用自定义缓存像我在这里:http://www.itsalltechnical.com/2011/01/non-web-expiring-generic-cache-in-c.html

我提到这一点,因为你可以自定义您检索数据的方式,如果你不喜欢的字典式的访问。我认为,在大多数缓存结构中,您会看到相同的字典方法,因此您可能会在此处出现问题。您可以考虑使用其他类型的基于高速对象的持久性,例如MongoDB或Cassandra(适用于Facebook)以获得吞吐量。幸运的是,你有很多选择。