天天看點

為什麼不能用memcached存儲Session?為什麼不能用memcached存儲Session?

為什麼不能用memcached存儲Session?為什麼不能用memcached存儲Session?

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

這意味着,如果所有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也可以)的模式:

當使用者登入時,将session “set”到memcached,并寫入資料庫;

在session中增加一個字段,辨別session最後寫入資料庫的時間;

每個頁面加載的時候,優先從memcached讀取session,其次從資料庫讀取;

每加載n頁或者y分鐘後,再次将session寫入資料庫;

從資料庫中擷取過期session,優先從memcached中擷取最新資料。

原文釋出時間:2015-01-29

本文來自雲栖合作夥伴“linux中國”