Memcached创建者Dormando非常早就写过两篇文章[1][2]。告诫开发者不要用memcached存储Session。

他在第一篇文章中给出的理由大致是说,假设用memcached存储Session,那么当memcached集群发生问题(比方内存溢出)或者维护(比方升级、添加或降低server)时,用户会无法登录。或者被踢掉线。而在第二篇文章中。他则指出。memcached的回收机制可能会导致用户无缘无故地掉线。



Titas Norkūnas是DevOps咨询服务提供商Bear
Mountain的联合创始人

因为看到Ruby/Rails社区忽略了Dormando那两篇文章所指出的问题,所以他近日撰文对此进行了进一步的阐述。

他觉得问题的根本在于,memcached是一个设计用于缓存数据而不是存储数据的系统。因此不应该用于存储Session







对于Dormando的那两篇文章,他觉得第一篇文章给出的原因非常easy理解,而人们常常会对第二篇文章给出的原因认识不足。

因此他对这个原因进行了具体地阐述:



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也能够)的模式:



当用户登录时,将Session “set”到memcached。并写入数据库。



在Session中添加一个字段,标识Session最后写入数据库的时间;



每一个页面载入的时候,优先从memcached读取Session。其次从数据库读取。



每载入N页或者Y分钟后,再次将Session写入数据库。



从数据库中获取过期Session,优先从memcached中获取最新数据。

參考来源: 

为什么不能用memcached存储Session?

http://www.lai18.com/content/431361.html

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

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

    以下内容转自:http://www.infoq.com/cn/news/2015/01/memcached-store-session -------------------------分割线---- ...

  2. php之memcached存储session配置、存储、获取

    [session] ①.session.save_handler = memcache session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字,默认是files ② ...

  3. 为什么不能用memcached存储Session

    Memcached创建者Dormando很早就写过两篇文章[1][2], 告诫开发人员不要用memcached存储Session.他在第一篇文章中给出的理由大致是说,如果用memcached存储Ses ...

  4. 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session

    什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...

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

    一.Memcached 存储 Session 由于 Memcached 是分布式的内存对象缓存系统,因此可以用来实现 Session 同步:把 Web 服务器中的内存组合起来,成为一个“内存池”,不管 ...

  6. Tomcat通过Memcached实现session共享的完整部署记录

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

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

    最近做了一个单点登录SSO,登陆后的凭证放到Memcached令牌放到Cookies:但是用户经常掉线,开发环境和测试却没有这个问题,最后从Memcached找到原因. Memcached概念.作用. ...

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

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

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

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

随机推荐

  1. 纪念2014 TI DSP大奖赛

    偶然发现TI官网有新闻报道大奖赛,还有沈洁女士给我们颁奖的照片.纪念一下. 第六届TI DSP及嵌入式大奖赛决赛暨颁奖典礼在厦门大学成功举行 Frances Han  2013-2014 TI DSP ...

  2. Android接口和框架学习

    Android接口和框架学习 缩写: HAL:HardwareAbstraction Layer.硬件抽象层 CTS:CompatibilityTest Suite,兼容性測试套件 Android让你 ...

  3. oracle如何创建数据库

    第一步: 从Windows桌面执行“开始”→“Database Configuration Assistant”命令,打开Database Configuration Assistant对话框的欢迎界 ...

  4. P1233 木棍加工

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  5. RAC中的各种IP-PUBLIC-VIP-Private-SCAN IP

    RAC中的各种IP-PUBLIC-VIP-Private-SCAN IP   1.PUBLIC和VIP Oracle RAC中每个节点都有一个虚拟IP,简称VIP, 与公网PUBLIC  IP在同一个 ...

  6. 切换JDK版本quick

    最近遇到一个小问题,同时做两个项目,jdk版本一个是5,一个是6,我也去网上找了找方法,但是感觉不是特别好用,最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击,输入一个数字回 ...

  7. 2.Matlab数值数组及其运算

    2.1引导 2.2一维数组的创建与寻访 2.3二维数组的创建 2.4二维数组元素的标识 2.5二维数组的子数组寻访和赋值 2.6执行数组运算的常用函数 2.7数组运算和矩阵运算 2.8多项式的表达和创 ...

  8. 17. Letter Combinations of a Phone Number[M]电话号码的字母组合

    题目 Given a string containing digits from 2-9 inclusive, return all possible letter combinations that ...

  9. Api接口服务的设计和安全解决方案

    这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) 普通网站应 ...

  10. 微信开发中的序列化json问题..

    微信开发平台: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list& ...