我有一个网站,允许用户使用各种搜索条件查询特定食谱。例如,您可以说“向我展示我可以在 30 分钟内制作的所有食谱,这些食谱使用鸡肉、大蒜和意大利面,但不使用橄榄油。”
此查询通过 JSON 发送到 Web 服务器,并反序列化为 SearchQuery
对象(具有各种属性、数组等)。
实际的数据库查询本身相当昂贵,并且有很多会经常使用的默认搜索模板。出于这个原因,我想开始缓存常见的查询。我对各种缓存技术进行了一些调查,并阅读了许多关于该主题的其他 SO 帖子,但我仍在寻找有关该走哪条路的建议。现在,我正在考虑以下选项:
System.Web.Caching
:这将提供对缓存中有多少项目、它们何时到期以及它们的优先级的大量控制。但是,缓存对象由字符串而不是可散列对象作为键。我不仅需要能够转换 SearchQuery
object 转换为字符串,但散列必须是完美的并且不会产生任何冲突。 Dictionary<SearchQuery, Results>
在所有 session 中持续存在于内存中的对象。由于搜索结果可能会开始变得相当大,我希望能够限制将缓存的查询数量并提供一种使旧查询过期的方法。像 FIFO 队列这样的东西在这里可以很好地工作。我担心线程安全之类的事情,并且想知道在这里编写自己的缓存是否值得。 我还研究了其他一些第三方缓存提供程序,例如 NCache和 Velocity .这些都是分布式缓存提供者,对于我目前需要的东西来说可能完全是矫枉过正。另外,似乎我见过的每个缓存系统仍然需要对象以字符串为键。理想情况下,我想要一些在进程中保存缓存的东西,允许我通过对象的哈希值进行键控,并允许我控制到期时间和优先级。
我很感激任何可以帮助我的免费和最好的开源解决方案的建议或引用。谢谢!
最佳答案
根据您的说法,我建议您使用 System.Web.Caching
并将其构建到您的 DataAccess
中层将其与系统的其余部分屏蔽。调用时,您可以根据您的业务/应用程序需求进行实时查询或从缓存对象中提取。我今天这样做,但使用 Memcached .
关于asp.net - 在 .NET webapp 中缓存复杂搜索查询的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9021661/