Iam为我们的.net Web服务寻找合适的数据结构,以获取xml作为查询并返回xml作为结果。
流程如下:用户给出一个查询字符串(大小约为2kb)并得到一个结果(大小约为50kb)。最后n个查询及其相应的结果被缓存,因此我们需要O(1)查询查询 - >结果。如果缓存已满(cache_size = n),则应从缓存中删除最旧的项目。
所以最后我需要一个主要像队列一样工作的数据结构(在O(1)中排队和出队),但也支持像字典这样的项目的O(1)查找。
我的第一个想法是使用从查询映射到结果的字典。为了跟踪项目的顺序,我将使用一个也包含查询的队列。但问题是,我会浪费内存,而且查找长查询字符串的所有这些查找都会变慢。我可以使用另一个字典将查询映射到创建的唯一id值,这样查询字符串只包含在一个集合中。
对于这个简单的任务,是不是有更简单,更有效的解决方案?
答案 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这样的完整缓存解决方案。