2009-07-10 44 views
1

我在我的網站上有一個可從每個頁面訪問的搜索功能。 masterpage文本框的典型頂部和按鈕處理。我正在尋找一種更好的方法來完成我使用System.Web.Caching.Cache緩存最常見的搜索字符串及其結果。在ASP.Net緩存中存儲頻繁的搜索字符串及其結果

我想連接搜索字符串與一些適用的用戶組權限數據,並使用它作爲值爲List的緩存鍵。

例如緩存鍵:

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

但是,這讓我想起了什麼是緩存鍵的最大長度。密鑰的最大長度是多少?通過嘗試以這種方式存儲事件可能會導致一些非常冗長的關鍵名稱值,並且它對於保留最常用的搜索以及最近使用的關鍵字並沒有做任何事情。

有沒有一種常用的方法來完成我想要做的事情?我的問題甚至有意義嗎?謝謝你的幫助。

+0

與任何事情一樣......測試和測試以確保您不會遇到內存限制。 – 2009-07-10 05:49:31

回答

1

但是,這讓我想到了什麼是緩存密鑰的最大長度。密鑰的最大長度是多少?通過嘗試存儲的東西這種方式可以用一些非常漫長的鍵名值結束了,它真的沒有做關於保持最常見的搜索,以及最近使用過的任何東西。

該鍵的長度是「字符串」本身的最大長度。

根據文檔這裏:http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx,密鑰可以與在對象類型的值的字符串定義。

我會建議標籤定製對象具有獨特的關鍵,所以,當你從緩存查詢,你可以沿着自定義對象標記更復雜的信息對象的自定義對象。

編輯11072009_1154

後,我仔細看了一遍你的要求,我注意到,你的目標是緩存經常搜索的字符串。

在你給出的示例,經常搜索的字符串可能是 「微軟的Visual Studio 2008 Service Pack 1的」。在我看來,這應該是關鍵,而價值是一個自定義對象,它將具有額外的屬性來保存其他必要的屬性。

總之,這可能是例如: 關鍵: 「微軟的Visual Studio 2008 Service Pack 1的」 值:CustomObjectInstance其中:CustomObjectInstance.UserLanguage = 「英語」 和CustomObjectInstance.UserLocalization: 「USA」,CustomObjectInstance.UserKeyboardLayout =「UK」等。

AFAIK,Cache實現了一種字典型的數據結構,所以密鑰必須足夠獨特。因此,如果您的密鑰是「Microsoft Visual Studio 2008 Service Pack 1 - usergroup2,3,6,17,89」,您如何唯一標識您的ASp.NET Web應用程序中的此特定密鑰?因爲在我的搜索文本框中,我不會插入usergroup 2,3,6,17,89

想想也像StackOverflow網站搜索功能:用戶將插入一個常見的搜索字符串,即「學習jquery材料」,然後在我看來,你的緩存鍵應該有一個「學習jQuery材料」的條目。

編輯11072009_1250

感謝您的附加信息。我還可以通過強制執行多個層來提供額外的解決方案,我的意思是,而不是將所有信息填充到一個緩存層中,爲什麼不存儲額外的層。

意味着你的緩存將有一個鍵(字符串)和一個指向字典的值。

另一種可能的解決方案是通過使用SQL Server全文索引搜索來推送這些功能,但我對SQL Server全文索引搜索並不十分熟悉,但如果我們可以將此功能用於現有基礎結構如果可能的話。

+0

「...使用唯一鍵標記自定義對象,以便在從緩存中進行查詢時,可以使用在自定義對象中標記的更復雜信息來對自定義對象進行對象。」 你能給我一些這樣的僞示例嗎? 你是說緩存一些自定義obj,它將把搜索細節作爲一個屬性以及結果列表的一個支撐嗎? 查看,原來我在想我會做的是建立一個搜索詳細信息的字符串作爲緩存鍵,它的值是列表 Billyhole 2009-07-11 03:42:15

0

緩存搜索結果是一種相當常見的技術。 ASP.NET緩存會將所有緩存的數據存儲在內存中以加快訪問速度。這一切都取決於有多少內存可用於緩存。如果您想偏離ASP.NET緩存方法,還有另一種實現方法 - 緩存從搜索中檢索到的數據的方法是將其存儲在數據庫表中。

用數十億記錄搜索表格確實很昂貴;因此,您可以將最多搜索的關鍵字的數據存儲在表中以便更快速地訪問。您還可以根據一些相當簡單的算法定期創建一個刷新表的工作。例如,最近最少使用的算法。您可以移除最近未使用的搜索結果。

編輯:而且,至於你的問題的緩存關鍵的長度;它是一個字符串,並且字符串的長度取決於可用於存儲它的內存。