2012-04-23 86 views
63

我目前使用db(mysql)來存儲我的會話。它很好用,但速度有點慢。與Redis存儲會話安全性如何?

我被要求使用Redis,但我想知道這是不是一個好主意,因爲我聽說Redis延遲了寫操作,所以我有點害怕因爲會話需要真實時間。

您是否遇到過這樣的問題?

+1

由於Redis說它具有可選的耐用性,那麼我認爲如果您選擇硬盤上的持久性,則可以使用它。但是,對於會話數據 - 我肯定會將它們保存到RAM中(這意味着我不會擔心整個考驗中的耐久性部分)。如果您丟失會話數據,應該發生的最糟糕的情況是讓您的用戶註銷。 – 2012-04-23 10:22:23

+1

是的,但這是我的要求的一部分,用戶不應該必須登錄回來,通過一些用戶數據持久會話,而用戶沒有登錄(訪客用戶)的方式。他們會使用Redis RAM,但啓用日誌記錄和/或備份。如果我們失去了一些會議,這是可接受的 – Trent 2012-04-23 10:28:09

+0

那麼,如果您使用的是硬盤存儲,那麼使用Redis有什麼意義?它可能會延遲實際提交到磁盤以提高性能,如果按這種方式進行配置,MySQL可能會做同樣的事情。你有沒有考慮將MySQL移到更快的I/O子系統?如果Redis不得不使用相同的I/O子系統,那麼在同樣的硬件上,Redis將不可能神奇地工作50倍。 – 2012-04-23 10:30:32

回答

110

Redis非常適合存儲會話。所有操作都在內存中執行,因此讀取和寫入將會很快。

第二個方面是會話狀態的持久性。 Redis爲您將會話狀態持久保存到硬盤提供了很大的靈活性。你可以通過http://redis.io/topics/persistence瞭解更多,但在較高的水平,這是你的選擇 -

  1. 如果你不能承受失去任何會話,在配置文件中設置appendfsync always。藉此,Redis保證任何寫入操作都被保存到磁盤。缺點是寫操作會變慢。
  2. 如果您沒有損失大約1秒的數據,請使用appendfsync everysec。這將給予卓越的性能與合理的數據保證
9

基本上有兩種主要類型可用:異步snapsnots和fsync()。它們分別被稱爲RDB和AOF。更多關於persistence modes on the official page

守護程序進程的信號處理在收到實例的SIGTERM時會同步到磁盤,因此在重新引導後數據仍然存在。我認爲即使使用默認設置(RDB快照),守護進程或操作系統也必須崩潰才能看到完整性損壞。

AOF設置使用Append Only File記錄服務器接收的命令,並從保存的文件中重新從頭開始重新創建數據庫。默認的磁盤同步策略是每秒刷新一次(IIRC),但可以設置爲在每個命令上鎖定和寫入。

同時使用快照和增量日誌似乎提供了一個長期的如果我錯過了幾秒鐘的數據方法與一個更安全,但昂貴增量日誌。 Redis支持開箱即用,因此複製也可以完成。

我正在使用默認的RDB設置,並將快照保存到遠程FTP。我還沒有看到導致數據丟失的故障。急性硬件故障或停電很可能,但我託管在VPS上。發生這種機會的機會很小:)