在asp.net中使用Linq查询缓存

时间:2011-12-09 16:41:25

标签: asp.net linq caching

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

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

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

2 个答案:

答案 0 :(得分:1)

在你开始之前,你真的需要在它周围有一些可衡量性 - 如果没有一些好的,可靠的数据来做出判断,就没有办法弄清楚你的变化是否有帮助或受到伤害。表演,特别是大规模表演不是你能想到或猜测的。你必须了解自己的方式。

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

你可能会更好地服务于:

  • 从一些老式的数据库调优开始 - 为什么你的查询如此缓慢而昂贵?你错过了某个地方的索引吗?
  • 查看缓存结果页面输出,特别是如果您的搜索网址具有GET功能,因为它非常易于管理。如果网站正在融化,这是一个很好的短期解决方案。
  • 请正确构建搜索位。使用LIKE%,无论%是不正确的搜索。数据库中的全文索引是一个良好的开端。像lucene.net这样的东西可能更好。

答案 1 :(得分:0)

不,不能使用AsQueryable查询User对象并获得我想要的结果。所以现在我将暂时使用静态列表,虽然我知道我必须尽快改变而不是更晚。