2011-06-28 36 views
5

建立網站時,必須決定如何存儲會話信息,當用戶登錄時。在文件vs數據庫中存儲會話數據的優點/缺點是什麼?

將每個會話存儲在自己的文件中與將其存儲在數據庫中有什麼優缺點?

+1

要清楚,像PHP這樣的語言默認在/ tmp文件中將會話存儲在文件中。但是,這些文件是由運行時管理的,您不需要像訪問文件一樣訪問會話。 RoR默認使用cookie,這也是基於文件的,但不是這樣處理的。 –

回答

2

我通常不會將這些信息存儲在一個文件中 - 您可能會冒這個文件進出內存的潛在風險(是的,它可能會被緩存),但我寧願使用內存機制然後你使用的是非常標準的東西。 在ASP.Net

  1. 你可以在內存中的集合,是好上一個服務器使用使用。如果您需要多個負載均衡的Web服務器(Web服務器場),並且用戶可以在每次請求時進入任何其他服務器,則此選項不好。如果Web進程重新啓動,會話將丟失。他們也可以超時。

  2. 您可以在asp.net中使用狀態服務器來訪問多個服務器 - 這會在您的Web服務器進程之外運行。如果Web進程重新啓動 - 您沒問題,多臺服務器都可以訪問它。流向狀態服務器的流量未加密,您最好使用IPSEC策略將流量保護在更安全的環境中。

  3. 您可以使用sql server通過設置web.config來使用sql server作爲會話數據庫來管理狀態(自動)。這提供了高性能數據庫和多服務器訪問的優勢。

  4. 您可以使用您自己的會話在數據庫中,如果你需要他們堅持到常態機制之外的很長一段時間,並希望在數據庫字段(也許你想查詢的特定字段)

更嚴格的控制

也只是出於好奇 - 也許你指的會議作爲用戶的喜好?在這種情況下研究asp.net配置文件

+0

也.. ..爲什麼要關注自己的細節 - 每個系統都有自己的內置方法 - 除非這是一個網站,您非常關心高性能,您可能不會注意到各種機制的差異。 –

1

Asp.net不便於在文件中存儲會話,但我不確定r-o-r。然而,將會話存儲在內存中(相同的進程)要比在數據庫中存儲會話要快。在數據庫中使用它可能會給應用程序帶來更好的可伸縮性(如果您想在Web場環境中部署應用程序 - 所有服務器都有一個通用的(db)查找會話)。

This代碼項目文章給出了有關asp.net會話管理的非常好的見解。

1

我猜,基於你以前的問題,這是在使用perl的CGI :: Application模塊,使用CGI :: Application :: Plugin ::會話。如果您使用該模塊的默認設置,它會將會話數據寫入存儲在/ tmp目錄中的文件 - 這非常類似於PHP。如果您的應用程序在共享主機環境中運行,出於安​​全原因,您可能不希望這樣做,因爲其他用戶可能能夠查看/修改/ tmp中的數據。您可以通過將文件寫入僅具有讀/寫權限的目錄(即不是/ tmp)來解決此問題。在開發過程中,我更喜歡使用YAML進行序列化,而不是默認(可存儲),因爲它是人類可讀的。如果你有自己的網絡服務器,並且你可以在同一臺機器上運行你的數據庫(mysql)服務器,那麼將會話數據存儲在數據庫而不是文件中通常會產生更高的性能 - 尤其是如果你能夠保持持久的數據庫連接(即使用mod_perl或fastcgi)。但是 - 如果您的數據庫位於遠程主機上,並且每次需要更新會話數據時都必須打開一個新連接,則性能可能會更糟,並且寫入文件可能會更好。請注意,您也可以使用sqlite,它看起來像數據庫到您的應用程序,但實際上只是您本地文件系統上的文件。無論性能如何,由於帶寬限制和其他資源限制,數據庫選項在共享主機環境中可能不受歡迎。對於低流量網站(即每天幾千次點擊),性能差異也可能忽略不計。

+0

是的,這是完全正確的=)我在這裏設置,想知道我應該如何存儲這個。我也是YAML的忠實粉絲。 「序列化」在這種情況下意味着什麼?我不假設你使用YAML而不是數據庫?關於基於文件和數據庫的非常有用的事實! –

+1

您的會話數據存儲在perl數據結構中(通常只是一個簡單的哈希)。您必須將該數據結構轉換爲可以在文件或數據庫中讀取和寫入的內容。這就是序列化的意思。如果您使用YAML,那麼您將數據序列化爲一個簡單的文本字符串。 「可存儲」模塊以更緊湊的二進制格式存儲數據。它速度非常快,而且非常高效 - 但它不是很便攜。過去,我被燒燬了,例如,升級版本,然後發現我們的新版本無法讀取舊版本寫入的數據。 – scorpio17

+1

我使用可用於mysql的可存儲序列化程序用於生產。但是,當開發新的東西時,我切換到基於文件的會話並使用YAML序列化,以便我可以輕鬆查看正在存儲的會話數據。它使調試更容易。在CGI :: Application中來回切換很容易。我控制所有應用程序類派生自基類內的cgiapp_init方法中的所有內容。 – scorpio17

相關問題