查询缓存的数据结构是什么?

时间:2011-04-07 09:47:14

标签: .net caching data-structures collections

Iam为我们的.net Web服务寻找合适的数据结构,以获取xml作为查询并返回xml作为结果。

流程如下:用户给出一个查询字符串(大小约为2kb)并得到一个结果(大小约为50kb)。最后n个查询及其相应的结果被缓存,因此我们需要O(1)查询查询 - >结果。如果缓存已满(cache_size = n),则应从缓存中删除最旧的项目。

所以最后我需要一个主要像队列一样工作的数据结构(在O(1)中排队和出队),但也支持像字典这样的项目的O(1)查找。

我的第一个想法是使用从查询映射到结果的字典。为了跟踪项目的顺序,我将使用一个也包含查询的队列。但问题是,我会浪费内存,而且查找长查询字符串的所有这些查找都会变慢。我可以使用另一个字典将查询映射到创建的唯一id值,这样查询字符串只包含在一个集合中。

对于这个简单的任务,是不是有更简单,更有效的解决方案?

3 个答案:

答案 0 :(得分:1)

我建议使用现有的HttpContext.Cache属性 - http://msdn.microsoft.com/en-us/library/system.web.httpcontext.cache.aspx

对于更大/分布式系统,请查看memcached(或memcacheddotnet - http://sourceforge.net/projects/memcacheddotnet/

就自己实施而言,建议您封装一个OrderedDictionary<>(http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx) - 保留所添加项目的顺序,以便您可以访问第一个/最后一个并添加到最后。对于固定大小的字典,查找将是O(1)我相信。事情是它将仅限于一个AppDomain。

答案 1 :(得分:1)

System.Web.Caching支持具有基于时间的到期和最大字节限制的Cache类。它需要.NET 4。

如果你变得更大(并且可以访问运行Linux的东西),我强烈推荐redis 我使用redis实现了一个类似的查询缓存,这是一个完全没有痛苦的过程。

答案 2 :(得分:1)

对于OrderedDictionary类可以执行的简单缓存。对于更大的系统,您可能需要考虑像memcached这样的完整缓存解决方案。