為什麼不能用memcached儲存Session

2021-08-01 20:16:36 字數 1065 閱讀 6157

memcached建立者dormando很早就寫過兩篇文章[1][2],告誡開發人員不要用memcached儲存session。他在第一篇文章中給出的理由大致是說,如果用memcached儲存session,那麼當memcached集**生故障(比如記憶體溢位)或者維護(比如公升級、增加或減少伺服器)時,使用者會無法登入,或者被踢掉線。而在第二篇文章中,他則指出,memcached的**機制可能會導致使用者無緣無故地掉線。

titas norkūnas是devops諮詢服務提供商bear mountain的聯合創始人。由於看到ruby/rails社群忽略了dormando那兩篇文章所指出的問題,所以他近日撰文對此進行了進一步的闡述。他認為問題的根本在於,memcached是乙個設計用於快取資料而不是儲存資料的系統,因此不應該用於儲存session。

對於dormando的那兩篇文章,他認為第一篇文章給出的原因很容易理解,而人們經常會對第二篇文章給出的原因認識不足。因此他對這個原因進行了詳細地闡述:

memcached使用「最近最少使用(lru)」演算法**快取。但memcached的lru演算法針對每個slab類執行,而不是針對整體。

這意味著,如果所有session的大小大致相同,那麼它們會分成兩三個slab類。所有其它大小大致相同的資料也會放入同一些slab,與session爭用儲存空間。一旦slab滿了,即使更大的slab中還有空間,資料也會被**,而不是放入更大的slab中……在特定的slab中,session最老的使用者將會掉線。使用者將會開始隨機掉線,而最糟糕的是,你很可能甚至都不會注意到它,直至使用者開始抱怨……

另外,norkūnas提到,如果session中增加了新資料,那麼session變大也可能會導致掉線問題出現。

有人提出將session和其它資料分別使用單獨的memcached快取。不過,由於memcached的lru演算法是區域性的,那種方式不僅導致記憶體使用率不高,而且也無法消除使用者因為session**而出現隨機掉線的風險。

如果讀者非常希望借助memcached提高session讀取速度,那麼可以借鑑norkūnas提出的memcached+rdbms(在有些情況下,nosql也可以)的模式:

**:

aspen為什麼不能用 地坪漆為什麼不能用在室內?

在很多的營銷號中,人們常說地坪漆為什麼不能在室內使用。但是這種說法是錯誤的,地坪漆的種類居多,不同的地坪的使用地方也不同。不同材料的地坪漆使用的地方也不同,比如在化工廠用在室內的話,那肯定是不可以的。下面我們來解析一下室內地坪。一 工程部位 室內地坪 二 地面施工工藝 基層處理 找標高 彈線 灑水濕...

oracle 查詢日期型別為什麼不能用

對於新手而言,沒有接觸過oracle經常會問oracle 查詢日期型別為什麼不能用 來查詢資料,對於這個問題要注意在等號的兩邊必須資料型別一致,比如 2010 9 19 這是乙個字串不能直接與日期型別字段比較 必須要進行日期轉換 1 日期轉換成字串 to char date,yyyy mm dd 2...

靜態方法為什麼不能用this和super

在靜態方法中是不能使用 this 預定義物件引用的 即使其後邊所操作的也是靜態成員也不行.因為 this 代表的是呼叫這個函式的物件的引用 而靜態方法是屬於類的 不屬於物件 靜態方法成功載入後 物件還不一定存在 2.在問題之前先講super的用法 1.super的用法跟this類似,this代表對本...