2

假設我們正在建立一個電子商務網站,允許消費者通過輸入關鍵字搜索產品。假設最多有20萬種產品,而且有數百萬的消費者正在使用該系統。假設產品表更新頻率相當高。由於產品數量不是很多,我們可能會將整個產品表存儲在內存中,並根據它進行搜索而不是擊中數據庫。我們希望創建分佈式緩存,它們存儲相同的數據,但駐留在不同的服務器中(爲了實現高可用性和性能),我們需要能夠在這些緩存之間同步數據,並在產品表被修改時使緩存無效。關於在高流量網站緩存的問題

我們的應用程序是使用ASP.NET MVC和NHibernate構建的。我想了解NHibernate的2級緩存是否有助於我的情況。如果你們能夠闡明這一點,我將非常感激。

據我所知,2級高速緩存將有助於緩存查詢結果,所以如果兩個不同的用戶使用相同的關鍵字搜索,L2高速緩存會從緩存中,而不是從數據庫服務的結果。但它對我們沒有多大幫助,因爲產品表經常更新並且緩存的結果將陳舊。 我的問題是我正確理解L2緩存,是否存在任何有助於管理緩存的方式(我想要的方式是多個緩存,相同的數據,緩存和無效緩存之間的同步)。任何想法,高度讚賞。

回答

2

曾使用這兩個二級緩存(使用memcached的提供商)和NHibernate.Search附加在我看來,你可以從雙方都有利。

的NHibernate.Search組件依賴Lucene.Net和關鍵字搜索是從數據庫中它的自我分離。每個映射的類都會創建一個不同的索引文件,並且可以使用屬性在屬性級別上設置優化,從而爲您提供更高級別的粒度。此外,您可以實現最佳匹配和命題(檢查動作中的Lucene和/或執行Hibernate搜索)。請注意,您不必維護索引(除非您明確請求索引重建);實現管理幕後的所有事情,儘管如果你願意的話你可以操縱索引。因此,添加/刪除/更新產品將自動更新相應的索引。

對於第二級緩存,您可以立即獲得性能提升。在數據集大約2 mil行的測試環境中,即使請求計數極低,我的性能也有20%以上的提高。隨着請求數量的增加,性能提升逐漸增大 - 應用程序首先遇到二級緩存,如果找不到它,則命中數據庫以獲取所需的行並將它們插入緩存中以備將來查詢。同樣,您可以管理諸如緩存持續時間和其他配置設置之類的內容,並且如果您希望這樣做,則可以明確地清除緩存(全部,它的一部分或特定條目)。請注意,緩存狀態在保存/更新/刪除期間由應用程序管理。

對於可擴展性 *第二級緩存取決於提供者(即memcached具有高性能和可擴展性並支持分佈式實例)。 *對於Lucene.Net/NHibernate.Search,您將需要設置索引將駐留的特定位置,並且該位置必須可供所有Web應用程序實例讀取/寫入。這裏請注意,敏感鏈接是I/O和文件爭用,因此使用比光文件系統更快的速度設置機器可以防止發生這種情況(我正在爲您的場景每秒發送數千次搜索請求)

作爲一個側面說明,我強烈推薦NHibernate.Search,因爲它比LIKE查詢要快得多,而且比在應用程序內執行SQL-Server的FullText搜索(我已經完成)更容易使用。

+0

感謝這個有用的信息,捷豹!我一直在研究NHibernate.Search和Lucene.NET,但除了Oren Eini博客上的資源外,還找不到很多資源。如果你知道其他有用的鏈接,我會非常感激,如果你可以傳遞它。我想知道的另一個問題是,在更新緩存或數據庫時,Lucene.NET索引的文檔如何與緩存或數據庫同步?從你的帖子看來,它好像是二級緩存和NHibernate.Search/Locene.NET好像一起工作得很好? – mwong 2010-02-16 14:37:54

+0

嗯,我已經閱讀了部分Hibernate Search的實際操作(http://www.manning.com/bernard/),除了用法上的配置差異大多相同。此外,我強烈建議Lucene在Action(http://www.manning.com/hatcher2/)上更強有力地討論Lucene是什麼以及它是如何做到的。 至於第二個問題,請記住緩存始終是數據庫的表示。 lucene索引與db條目同步,是的,它們工作正常 – Jaguar 2010-02-16 17:42:21

2

無論二級高速緩存將有助於準確地取決於你的產品表是如何頻繁相對於高速緩存命中更新。如果您每小時添加100個新產品,但每小時收到10,000個查詢,即使10%的緩存命中率也會產生很大的差異。如果費率相反,二級緩存幾乎沒有價值。

我建議你設置了一個壓力測試環境,非常接近您的生產環境和各種二級緩存提供商進行基準測試。

還要檢查您的數據庫配置是否適合更新繁重的情況。

1

我推薦使用NHibernate.Search w/Lucene。它與二級緩存一起工作。 Lucene可以快速完成複雜的文本搜索,然後將實體鍵返回給NHibernate,從而將完整的實體從第二級緩存中提取出來。 NHibernate.Search擴展完成了保持你的Lucene索引同步的工作。

TekPub做了搜索的產品說明您的具體情況最近的插曲。該插曲比較NHibernate查詢,SQL全文索引和Lucene w/NHibernate.Search。

+0

爲什麼-1這個答案? – mwong 2010-02-11 18:09:37

+0

全文索引就是這樣的東西。通配符「like」的SQL查詢是錯誤的方法。 – 2010-02-11 18:42:37