为什么不能用 memcached 存储 Session

一、如果用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 中获取最新数据。

时间: 2024-11-03 21:23:27

为什么不能用 memcached 存储 Session的相关文章

为什么不能用memcached存储Session?

Memcached创建者Dormando非常早就写过两篇文章[1][2].告诫开发者不要用memcached存储Session. 他在第一篇文章中给出的理由大致是说,假设用memcached存储Session,那么当memcached集群发生问题(比方内存溢出)或者维护(比方升级.添加或降低server)时,用户会无法登录.或者被踢掉线.而在第二篇文章中.他则指出.memcached的回收机制可能会导致用户无缘无故地掉线. Titas Norkūnas是DevOps咨询服务提供商Bear Mou

[转]为什么不能用memcached存储Session

以下内容转自:http://www.infoq.com/cn/news/2015/01/memcached-store-session -------------------------分割线----------------------------------------------- Memcached创建者Dormando很早就写过两篇文章[1][2],告诫开发人员不要用memcached存储Session.他在第一篇文章中给出的理由大致是说,如果用memcached存储Session,那么

让php或httpd服务来使用memcached存储session数据

memcached命令行 memcached语法 <command?name>?<key>?<flags>?<exptime>?<bytes>\r\n?<data?block>\r\n注:??\r\n在windows下是Enter键 <command?name>可以是set,?add,?replace set ? ? ? ? ? 表示按照相应的<key>存储该数据,??没有的时候增加,??有的时候覆盖 add

symfony2使用Memcached存储Session

1.添加如下代码到app/config/services.yml: parameters:     memcached.servers:       - { host: 127.0.0.1, port: 11211 }   services:     session.handler.memcached:         class: Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler  

Memcached 笔记与总结(9)Memcached 与 Session

一.Memcached 存储 Session 由于 Memcached 是分布式的内存对象缓存系统,因此可以用来实现 Session 同步:把 Web 服务器中的内存组合起来,成为一个“内存池”,不管是哪个服务器产生的 Sessoin 都可以放到这个“内存池”中,其他的 Web 服务器都可以使用.使用 Memcached 来同步 Session 的优点是:不会加大数据库的负担,并且安全性比 Cookie 高,把 Session 放到内存里面,读取速度比其他处理方式要快很多. 自定义使用 Memc

Memcached存Session数据、访问安全性、使用场景总结(3)

最近做了一个单点登录SSO,登陆后的凭证放到Memcached令牌放到Cookies:但是用户经常掉线,开发环境和测试却没有这个问题,最后从Memcached找到原因. Memcached概念.作用.运行原理.特性.不足简单梳理(1) Memcached下载安装.NET对Memcached进行CRUD操作(2) Memcached存Session数据.访问安全性.使用场景总结(3) 一.Session数据放入到Memcached? Memcached创建者Dormando写过两篇文章: Sess

Memcached缓存Session(不建议)

本文源链接地址:https:www.93bok.com 实验环境: Centos6.5minimal 64位系统 服务器IP:192.168.10.22 说明: 1. LNMP+Memcached环境搭建不再演示,可参考之前文章 2. 相信大家也看到了,文章的后边加了(不建议)的后缀,说说原因吧: A.如果用memcached存储Session,那么当memcached集群发生故障(比如内存溢出)或者维护(比如升级.增加或减少服务器)时,用户会无法登录,或者被踢掉线 B.memcached 的回

Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性,不得不说下Http协议.我们常常听到说,Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.之所以我们在使用ASP.NET WebForm开发中会感觉不到Http的无状态特

Memcached实现Session共享

一.memcached安装 1. memcached安装和启动.查看进程 安装扩展源 yum install -y epel-release 安装软件.组件.工具包 yum install -y libevent memcached libmemcached 启动 /etc/init.d/memcached start 进程 ps aux |grep memcached 解释: -d  启动一个守护进程 -p  监听的端口,默认11211 -u  运行memcached用户 -m 内存大小,单位