【发布时间】:2012-02-19 18:07:59
【问题描述】:
我有一个网站,允许用户使用各种搜索条件查询特定食谱。例如,您可以说“向我展示我可以在 30 分钟内制作的所有食谱,这些食谱将使用鸡肉、大蒜和意大利面,但不使用橄榄油。”
此查询通过 JSON 发送到 Web 服务器,并反序列化为 SearchQuery 对象(具有各种属性、数组等)。
实际的数据库查询本身是相当昂贵的,并且有很多默认的搜索模板会被频繁使用。出于这个原因,我想开始缓存常见的查询。我已经对各种缓存技术进行了一些调查,并阅读了很多关于该主题的其他 SO 帖子,但我仍在寻找关于走哪条路的建议。目前,我正在考虑以下选项:
-
内置
System.Web.Caching:这将提供对缓存中的项目数量、到期时间和优先级的大量控制。但是,缓存对象由字符串而不是可散列对象作为键。我不仅需要能够将SearchQuery对象转换为字符串,而且哈希必须是完美的并且不会产生任何冲突。 -
开发我自己的 InMemory 缓存:我真正想要的是一个在所有会话中都保留在内存中的
Dictionary<SearchQuery, Results>对象。由于搜索结果可能开始变得相当大,我希望能够限制将缓存的查询数量,并为旧查询提供一种过期方式。像 FIFO 队列这样的东西在这里可以很好地工作。我很担心线程安全之类的事情,并且想知道在这里编写自己的缓存是否值得。
我还研究了其他一些第三方缓存提供程序,例如 NCache 和 Velocity。这些都是分布式缓存提供程序,可能完全满足我目前的需求。另外,似乎我见过的每个缓存系统仍然需要用字符串作为键的对象。理想情况下,我想要一个在进程中保存缓存的东西,允许我按对象的哈希值作为键,并允许我控制过期时间和优先级。
如果有任何关于免费且最好是开源的解决方案的建议或参考资料,我将不胜感激。谢谢!
【问题讨论】:
标签: asp.net .net performance caching