为什么不能用memcached存储Session?

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

时间: 2024-07-28 21:16:41

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

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

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

为什么不能用 memcached 存储 Session

一.如果用memcached 存储 Session,那么当 memcached 集群发生故障(比如内存溢出)或者维护(比如升级.增加或减少服务器)时,用户会无法登录,或者被踢掉线. 二.memcached 的回收机制可能会导致用户无缘无故地掉线.因为Memcached 使用"最近最少使用(LRU)"算法回收缓存.这意味着,如果所有 Session 的大小大致相同,那么它们会分成两三个 slab 类.所有其它大小大致相同的数据也会放入同一些 slab,与 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 内存大小,单位