2008-11-14 43 views
5

我在服務層使用Memcached,在負載均衡的Web服務器環境中使用ASP.NET和WCF服務。Memcached是否可以與ASP.NET狀態服務器互換?

我也想用Memcached替換ASP.NET狀態服務器(用於會話狀態)的使用。 現在我恐怕這不是一件好事,因爲據我所知, Memcached是一個緩存服務器而不是狀態服務器,這是真的嗎?

如果我理解正確,Memcached不會將數據分發到Memcached場中的其他節點。 而是使用特殊的哈希算法來確定服務器場中的哪個節點包含請求的鍵的數據,而ASP.NET狀態服務器在添加時儘快分配數據以防止單點故障。

換句話說,Memcached只能用於性能方面的原因,存儲在其中的數據應該始終可以重新創建, 如果物品已被移除以騰出空間存放新物品,或者單個機器實際存儲的數據被關閉了。

所以我不能僅僅依靠Memcached來存儲會話狀態數據嗎? 如果我不能,那麼我不明白如何經常比較Memcached和看作 替代使用ScaleOut StateServer和ASP.NET狀態服務器, ,因爲這些是真正的狀態服務器,這是另一回事,是正確的?

我現在對Web服務器場中高性能分佈式會話狀態的最佳方法有些不確定。

感謝

+1

我不相信歸屬於ASP.NET狀態服務器的故障轉移屬性存在。至少,據我所知,沒有什麼可以做到的。這是一個單一的失敗點。 – 2011-06-02 07:46:02

回答

1

Memcached的不支持數據目前鏡像,它只提供了跨倍數服務器分割你的項目,試圖阻止人們越來越氾濫成災的能力。這可以通過將密鑰與服務器的地址進行散列或使用一致性散列算法(libketama)來實現。

一般來說,Memcached不應被視爲持久存儲層,並且在幾乎所有情況下,緩存中的數據應與數據庫中的數據相同。如果您要更改用戶的會話數據並緩存該數據,請在Memcached中對其進行更新,然後在數據庫中立即對其進行更新。如果你想要非常小心,你可以實現一個簡單的日誌系統,以確保這些數據在系統故障的情況下保持一致。

儘管Memcached肯定被用於緩存會話,但創作者在Jinux Journal的文章中表達了這一點。這實際上只是爲了優化讀取操作,在一天結束時,您關心的任何數據都應該存儲在數據庫中。

0

在理想情況下,會話數據只是一個值,即用戶標識的內部數字表示。這意味着用戶通過提供正確的密碼成功通過登錄頁面。

但是別人喜歡什麼,例如以stackoverflow爲例,頁面上的動態數據取決於用戶:用戶的暱稱,信譽數量,獲得的徽章,發表評論的權限。它們通常是跨多個數據庫表的多個JOIN的結果。

如果你沒有使用memcached,這些查詢幾乎總是從磁盤讀取數據,這是一個非常緩慢,不可伸縮的操作。數據庫內的緩存?你認爲命中率會考慮數據庫處理會話數據以外的事情嗎?爲什麼你需要從內存中讀取磁盤?

當然,對相關用戶信息的任何寫入操作都會使memcached中相應的會話無效。

+0

誰說過關於數據庫的任何事情? 問題是Memcached是否可以直接作爲狀態服務器互換到ASP.NET狀態服務器, 考慮到Memcached緩存未同步,因此如果一個節點關閉,數據可能會丟失。 – baretta 2008-11-14 22:54:55

4

http://www.codeplex.com/memcachedproviders有一個asp.net會話狀態提供程序,它將值存儲在memcached中。它提供了在' SQL Server中備份會話數據的功能。正如瑜伽士所說,會話數據被存儲爲一個值。 如果發生驅逐事件,該用戶的整個會話都會丟失,用戶將被引導至登錄屏幕。 Memcached在到期之前不會驅逐任何數據,除非它的空間不足以容納新數據。

相關問題