【问题标题】:Querying the Cache using Linq in asp.net在 asp.net 中使用 Linq 查询缓存
【发布时间】:2012-01-16 22:29:52
【问题描述】:

搜索是我们网站上最常用的功能,搜索查询是在我们的数据库上执行的 CPU 最密集、最复杂和频繁的查询,导致数据库服务器上的 CPU 使用率很高。为了减少数据库的负载,我们一直在研究各种缓存策略。目前,我们打算使用 ASP.NET 缓存。

这个想法是在缓存中拥有一个包含最频繁/最近创建/访问的对象的内存数据库,然后使用 linq 查询内存数据库以得出搜索结果。我最初的想法是缓存用户列表,然后使用 linq 查询或修改此列表。但是考虑到多个线程访问或尝试修改 List 的复杂性,我正在寻找其他选项。

当时我认为不是缓存列表,而是以 ID 作为键缓存单个用户对象并尝试查询缓存。在http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx 我看到 Cache 有一个扩展方法 AsQueryable 但我不确定这是什么意思。缓存是一个键值对,所以使用 AsQueryable 我可以查询键并获得一组用户对象,还是我能够查询用户对象并获得我想要的结果?

【问题讨论】:

    标签: asp.net linq caching


    【解决方案1】:

    在开始之前,您确实需要围绕它进行一些可衡量性 - 如果没有一些好的、可靠的数据来做出判断,就无法确定您的更改是有帮助还是有害。性能,尤其是大规模性能不是您可以思考或猜测的。你必须知道如何通过它。

    至于您的解决方案,我认为您很可能会使问题变得更糟,或者至少在这里制造另一个问题。理论上,您的数据库服务器旨在有效地处理跨大量信息集的任意用户查询。 Linq 很棒,但它并不是一个真正的临时搜索引擎——它没有人们真正期望搜索引擎提供的那种索引功能。仅仅因为它可以将事物公开为 IQueryable 并不意味着您应该那样对待它。即使你有办法有效地搜索缓存,你还有另一个问题要解决——你如何识别最常用的内容?以及如何管理 ASP.NET 缓存以在内存不足时不开始弹出内容?

    您可能会在这里得到更好的服务:

    • 从一些好的老式数据库调优开始——为什么您的查询如此缓慢和昂贵?您是否在某处缺少索引?
    • 查看缓存结果页面输出,特别是如果您的搜索 URL 支持 GET,因为这很容易管理。如果网站正在融化,这是一个很好的短期解决方案。
    • 查看正确构建搜索位。使用 LIKE %whatever% 不是正确的搜索。数据库中的全文索引是一个好的开始。像lucene.net 这样的东西可能更好。

    【讨论】:

    • 这不是文本搜索。事实上,搜索基本上是一个查询,只是它有多个连接和一些用户定义的函数,这使得它变慢了。我认为我所说的 Linq 方法是正确的方法,至少目前是这样。无论如何,感谢您的建议。
    【解决方案2】:

    不,不能使用 AsQueryable 来查询 User 对象并获得我正在寻找的所需结果。所以现在我将暂时使用静态列表,尽管我知道我必须尽快改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      相关资源
      最近更新 更多