asp.net - 在 .NET webapp 中缓存复杂搜索查询的最佳方法是什么?

标签 asp.net .net performance caching

我有一个网站,允许用户使用各种搜索条件查询特定食谱。例如,您可以说“向我展示我可以在 30 分钟内制作的所有食谱,这些食谱使用鸡肉、大蒜和意大利面,但不使用橄榄油。”

此查询通过 JSON 发送到 Web 服务器,并反序列化为 SearchQuery对象(具有各种属性、数组等)。

实际的数据库查询本身相当昂贵,并且有很多会经常使用的默认搜索模板。出于这个原因,我想开始缓存常见的查询。我对各种缓存技术进行了一些调查,并阅读了许多关于该主题的其他 SO 帖子,但我仍在寻找有关该走哪条路的建议。现在,我正在考虑以下选项:

  • 内置 System.Web.Caching :这将提供对缓存中有多少项目、它们何时到期以及它们的优先级的大量控制。但是,缓存对象由字符串而不是可散列对象作为键。我不仅需要能够转换 SearchQuery object 转换为字符串,但散列必须是完美的并且不会产生任何冲突。
  • 开发我自己的 InMemory 缓存:我真正想要的是 Dictionary<SearchQuery, Results>在所有 session 中持续存在于内存中的对象。由于搜索结果可能会开始变得相当大,我希望能够限制将缓存的查询数量并提供一种使旧查询过期的方法。像 FIFO 队列这样的东西在这里可以很好地工作。我担心线程安全之类的事情,并且想知道在这里编写自己的缓存是否值得。

  • 我还研究了其他一些第三方缓存提供程序,例如 NCacheVelocity .这些都是分布式缓存提供者,对于我目前需要的东西来说可能完全是矫枉过正。另外,似乎我见过的每个缓存系统仍然需要对象以字符串为键。理想情况下,我想要一些在进程中保存缓存的东西,允许我通过对象的哈希值进行键控,并允许我控制到期时间和优先级。

    我很感激任何可以帮助我的免费和最好的开源解决方案的建议或引用。谢谢!

    最佳答案

    根据您的说法,我建议您使用 System.Web.Caching并将其构建到您的 DataAccess 中层将其与系统的其余部分屏蔽。调用时,您可以根据您的业务/应用程序需求进行实时查询或从缓存对象中提取。我今天这样做,但使用 Memcached .

    关于asp.net - 在 .NET webapp 中缓存复杂搜索查询的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9021661/

    相关文章:

    Java:关于调用 Runtime.freeMemory()、Runtime.totalMemory() 和 Runtime.maxMemory() 的成本

    Java 多级同步

    mysql - 如何优化以下 SQL 查询?

    详细信息 View 中的 ASP.NET 日期格式

    asp.net - Asp.net Core中多个模型与注释模型的关系

    c# - 使用 Mono 针对 .NET Framework 4.0 进行定位和编译

    c# - 为一些(但不是所有)继承类引入 setter

    c# - RedirectToAction 到不同的 Controller 而不改变 URL

    c# - 为什么我的登录页面一直在重新加载,而没有尝试进行身份验证?

    c# - 如何从列表<string>中找到元素的索引,元素包含特定部分