Web应用程序 - 缓存架构

时间:2011-04-28 14:40:41

标签: .net architecture data-structures caching

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

也许我所做的完全错了,但我想到的一些事情是:

  1. 在Db中创建一个与我在缓存中完全相同的新表。这将由CreateDate和高度索引的
  2. 聚类
  3. 继续尝试优化查询/数据库,以便查询更快
  4. 保留WCF服务,但是已经创建了一个新的ExpiryDate字段,并且该记录已过期,那么未使用的旧内容将不会延迟。
  5. 想法?

1 个答案:

答案 0 :(得分:0)

您可以使用我在此处的自定义缓存:http://www.itsalltechnical.com/2011/01/non-web-expiring-generic-cache-in-c.html

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