将频繁搜索字符串及其结果存储在ASP.Net缓存中

时间:2009-07-10 05:18:05

标签: asp.net caching

我的网站上有一个可以从每个页面访问的搜索功能。主页文本框和按钮交易的典型顶部。我正在寻找一种更好的方法来使用System.Web.Caching.Cache完成我对最常见搜索字符串及其结果的缓存。

我在考虑将搜索字符串与一些适用的用户组权限数据连接起来,并将其用作缓存键,其值为List。

示例缓存键:

Microsoft Visual Studio 2008 Service Pack 1--usergroup2,3,6,17,89

但这让我想到了缓存密钥的最大长度是多少。密钥可以有最大长度吗?通过尝试以这种方式存储东西最终会得到一些非常冗长的键名值,并且它实际上没有做任何关于保持最常见的搜索以及最近使用的搜索。

是否已经有一种常用的方法来完成我想要做的事情?我的问题是否有意义?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

  

但这让我想到了缓存密钥的最大长度是多少。密钥可以有最大长度吗?通过尝试以这种方式存储东西最终会得到一些非常冗长的键名值,并且它对于保留最常见的搜索以及最近使用的搜索实际上没有任何作用。

密钥的长度是“字符串”本身的最大长度。

根据此处的文档:http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx,密钥可以在字符串中定义,其值为Object type。

我建议使用唯一键标记自定义对象,这样当您从缓存中查询时,您可以使用自定义对象中标记的更复杂信息来对象自定义对象。

编辑11072009_1154

在我再次仔细阅读您的要求后,我注意到您的目标是缓存频繁搜索字符串。

在您给出的示例中,频繁搜索字符串可能是“Microsoft Visual Studio 2008 Service Pack 1”。在我看来,这应该是关键,而值是一个自定义对象,它将具有其他属性来保存您的其他必要属性。

总之,这可能是一个例子: 密钥:“Microsoft Visual Studio 2008 Service Pack 1” 值:CustomObjectInstance其中:CustomObjectInstance.UserLanguage =“English”和CustomObjectInstance.UserLocalization:“USA”,CustomObjectInstance.UserKeyboardLayout =“UK”等。

AFAIK,Cache实现了字典类型的数据结构,因此密钥必须足够独特。因此,如果您的密钥是“Microsoft Visual Studio 2008 Service Pack 1 - usergroup2,3,6,17,89”,您如何从ASp.NET Web应用程序中唯一标识此特定密钥?因为在我的搜索文本框中,我不会插入usergroup2,3,6,17,89

也像StackOverflow网站搜索功能一样:用户将插入一个公共搜索字符串,即“学习jquery材料”,然后在我看来,你的缓存键应该有一个“学习jquery材料”的条目。

编辑11072009_1250

感谢您提供更多信息。我还可以通过强制执行多个层来提供额外的解决方案,我的意思是,而不是将所有信息塞进一层缓存中,为什么不存储额外的层。

表示您的缓存将具有一个键(字符串)和一个再次指向字典的值。

另一种可能的解决方案是使用SQL Server全文索引搜索来推送这些功能,我对SQL Server全文索引搜索并不十分熟悉,但如果我们可以将此功能用于现有基础结构,则可能会很好。可能的。

答案 1 :(得分:0)

缓存搜索结果是一种相当常见的技术。 ASP.NET Cache将所有缓存的数据存储在内存中,以便更快地访问。这一切都取决于您可用于缓存的内存量。如果你想偏离ASP.NET Cache方法,还有另一种实现方法 - 用于缓存从搜索中检索的数据的方法是将其存储在数据库表中。

搜索包含数十亿条记录的表非常昂贵;因此,您可以将表中搜索次数最多的关键字的数据存储在表格中,以便更快地访问。您还可以基于一些相当简单的算法,定期创建作业来刷新表。例如,最近最少使用的算法。您可以删除最近未使用过的搜索结果。

编辑:而且,关于缓存密钥长度的问题;它是一个字符串,字符串的长度取决于可用于存储它的内存。