2012-04-09 97 views
16

我在PHP中使用會話來跟蹤用戶是否已登錄。我不使用它來存儲有關用戶的任何其他數據;基本上就像檢查一個散列表來查看用戶是否已經過認證。redis vs本機會話

使用redis代替原生PHP會話會有一些優勢嗎?

我對性能,可伸縮性和安全性(並非真正關心代碼複雜性)感到好奇。

+1

我真的不覺得你需要擔心很多會話,除非你得到大量的流量,PHP處理會話很好,如果你只存儲那麼少的數據,即使有很多請求也應該沒問題,並且關於它的性能應該很接近,因爲redis不是PHP本地的。 – gosukiwi 2012-04-09 16:42:14

+0

@gosukiwi謝謝!大量的意思是什麼?像10k用戶一次,或像1mil?我知道這取決於我的機器,但即時通訊嘗試查看,如果PHP可能有一些上限(如將每個會話存儲爲單個文件,使其受操作系統文件系統性能影響)。 – tau 2012-04-09 16:53:05

+1

那麼我會擔心在這種情況下的服務器的內存使用情況,因爲它都存儲在RAM中,與10K用戶,如果每個用戶使用像會話的1kb數據,它會消耗10,000kb或10〜MB,這不是很大程度上,PHP足夠聰明,可以使用足夠好的數據結構來保存並快速寫入和讀取這些值,問題在於會話數據太大或者由於某種原因服務器消耗了太多的資源來讀取會話數據,但是這通常是因爲數據太大。 – gosukiwi 2012-04-09 16:58:22

回答

-35

會不會有一些優勢,使用Redis的,而不是本地的PHP會議?

性能 - PHP會話更好。它們將比Redis更快,因爲它從RAM讀取而不是通過網絡讀取數據。

可擴展性 - Redis會話更好。 PHP會話只能在一臺機器上運行。如果您需要多臺機器來處理請求,則必須執行粘性會話。藉助Redis,幾臺機器可以共享會話狀態。用戶請求可以毫無問題地進入任何服務器。

耐用性 - 如果Web服務器由於某種原因而崩潰,將會失去所有會話狀態。藉助Redis,您可以擁有各種持久性選項。你可以確保即使某個特定的Redis服務器出現故障

安全不會丟失會話信息 - 您可以通過兩種方法實現極大的安全,也可以完全亂了使用這兩種方法。所有的事情都是平等的,我會說PHP會話會更安全一些,因爲有一件事要擔心。

+44

PHP會話不是存儲在RAM中,而是存儲在磁盤上的文件。誰告訴你,當Web服務器重新啓動時,他們會丟失? – ThiefMaster 2012-04-10 10:36:08

+0

@ThiefMaster - 我沒有意識到PHP會話存儲在磁盤上。這就是說,我對耐久性的觀點是。如果服務器崩潰(而不是重新啓動),則會丟失會話數據。藉助Redis或MySQL支持的會話,您擁有更好的耐用性。 – 2012-04-10 10:41:37

+9

即使你不一定會失去他們。除非操作系統崩潰,會話文件損壞或實際上沒有寫入硬盤。 – ThiefMaster 2012-04-10 10:43:09

0

我真的不認爲你需要擔心很多會話,除非你得到大量的流量,PHP處理會話很好,而且如果你只存儲這些小數據,即使有很多請求也應該沒問題,並且關於性能應該接近,因爲redis不是PHP本地的。

對於10k用戶,如果每個用戶使用會話的1kb數據,則會消耗10,000kb或10〜mb,這並不多; PHP足夠聰明,可以使用足夠好的數據結構來保存並快速編寫和讀取這些值。問題是如果會話數據太大,或者由於某種原因,服務器會消耗太多資源來讀取會話數據,但通常情況下,如果數據太大。

11

你想要的會話保存處理程序要快。這是因爲PHP會話會阻止來自同一用戶的所有其他併發請求,直到第一個請求完成。

有多種處理程序可用於跨多個服務器的PHP會話:具有NFS,MySQL數據庫,Memcache和Redis的文件。

數據庫方法(使用InnoDB)是我在使用File w/NFS後遇到的最慢的方法。鎖定和寫入爭用是主要因素。 Memcache和Redis提供了類似的性能,並且由於所有操作都在RAM中,因此是更好的選擇。 Redis是我的選擇,因爲您可以啓用磁盤持久性,而Memcache僅基於內存。

我解釋Redis Sessions in PHP with Kohana如果你想要更多的細節。這裏是我們管理的Redis鍵儀表板:

Redis Dashboard

12

使用類似的Redis用於存儲會話是一個偉大的方式來擺脫負載平衡服務器的更多性能。

例如,在亞馬遜網絡服務上,負載平衡器具有所謂的「粘性會話」。這意味着當用戶第一次連接到您的網絡應用時,例如當登錄時,負載平衡器將選擇一個應用服務器,並且該用戶將繼續從該服務器提供服務,直到他們退出應用程序。這是因爲PHP使用的會話將存儲在首次使用的應用程序服務器上。

現在,如果您在單獨的服務器上使用Redis,然後在每臺應用服務器上配置您的PHP以將其會話存儲在Redis中,則可以關閉此「粘性會話」。這意味着您的任何服務器都可以訪問這些會話,因此,用戶可以通過不同的服務器向您的應用程序發送每個請求。這最終可以更有效地使用您的負載平衡設置。