二、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 中获取最新数据。
原文地址:http://blog.csdn.net/wwd0501/article/details/45640603