一、如果用memcached 儲存 Session,那麼當 memcached 叢集發生故障(比如記憶體溢位)或者維護(比如升級、增加或減少伺服器)時,使用者會無法登入,或者被踢掉線。
二、memcached 的回收機制可能會導致使用者無緣無故地掉線。因為Memcached 使用“最近最少使用(LRU)”演算法回收快取。這意味著,如果所有 Session 的大小大致相同,那麼它們會分成兩三個 slab 類。所有其它大小大致相同的資料也會放入同一些 slab,與 Session 爭用儲存空間。一旦 slab 滿了,即使更大的 slab 中還有空間,資料也會被回收,而不是放入更大的 slab 中……在特定的 slab 中,Session 最老的使用者將會掉線。使用者將會開始隨機掉線, 而最糟糕的是, 你很可能甚至都不會注意到它, 直至使用者開始抱怨……另外,如果 Session 中增加了新資料,那麼 Session 變大也可能會導致掉線問題出現。
有人提出將 Session 和其它資料分別使用單獨的 memcached 快取。不過,由於memcached 的 LRU 演算法是區域性的,那種方式不僅導致記憶體使用率不高,而且也無法消除使用者因為 Session 回收而出現隨機掉線的風險。
注:memcached 是一個設計用於快取資料而不是儲存資料的系統,因此不應該用於儲存 Session。
如果非常希望藉助 memcached 提高 Session 讀取速度,那麼可以借鑑Norkūnas 提出的 memcached+RDBMS (在有些情況下, NoSQL 也可以) 的模式:
1、當用戶登入時,將 Session “set”到 memcached,並寫入資料庫;
2、 在 Session 中增加一個欄位,標識 Session 最後寫入資料庫的時間;
3、每個頁面載入的時候, 優先從 memcached 讀取 Session, 其次從資料庫讀取;
4、每載入 N 頁或者 Y 分鐘後,再次將 Session 寫入資料庫;
5、從資料庫中獲取過期 Session,優先從 memcached 中獲取最新資料。
一、如果用memcached 儲存 Session,那麼當 memcached 叢集發生故障(比如記憶體溢位)或者維護(比如升級、增加或減少伺服器)時,使用者會無法登入,或者被踢掉線。
二、memcached 的回收機制可能會導致使用者無緣無故地掉線。因為Memcached 使用“最近最少使用(LRU)”演算法回收快取。這意味著,如果所有 Session 的大小大致相同,那麼它們會分成兩三個 slab 類。所有其它大小大致相同的資料也會放入同一些 slab,與 Session 爭用儲存空間。一旦 slab 滿了,即使更大的 slab 中還有空間,資料也會被回收,而不是放入更大的 slab 中……在特定的 slab 中,Session 最老的使用者將會掉線。使用者將會開始隨機掉線, 而最糟糕的是, 你很可能甚至都不會注意到它, 直至使用者開始抱怨……另外,如果 Session 中增加了新資料,那麼 Session 變大也可能會導致掉線問題出現。
有人提出將 Session 和其它資料分別使用單獨的 memcached 快取。不過,由於memcached 的 LRU 演算法是區域性的,那種方式不僅導致記憶體使用率不高,而且也無法消除使用者因為 Session 回收而出現隨機掉線的風險。
注:memcached 是一個設計用於快取資料而不是儲存資料的系統,因此不應該用於儲存 Session。
如果非常希望藉助 memcached 提高 Session 讀取速度,那麼可以借鑑Norkūnas 提出的 memcached+RDBMS (在有些情況下, NoSQL 也可以) 的模式:
1、當用戶登入時,將 Session “set”到 memcached,並寫入資料庫;
2、 在 Session 中增加一個欄位,標識 Session 最後寫入資料庫的時間;
3、每個頁面載入的時候, 優先從 memcached 讀取 Session, 其次從資料庫讀取;
4、每載入 N 頁或者 Y 分鐘後,再次將 Session 寫入資料庫;
5、從資料庫中獲取過期 Session,優先從 memcached 中獲取最新資料。