`

为什么不能用memcached存储Session?

 
阅读更多
Memcached创建者Dormando很早就写过两篇文章[1][2],告诫开发人员不要用memcached存储Session。他在第一篇文章中给出的理由大致是说,如果用memcached存储Session,那么当memcached集群发生故障(比如内存溢出)或者维护(比如升级、增加或减少服务器)时,用户会无法登录,或者被踢掉线。而在第二篇文章中,他则指出,memcached的回收机制可能会导致用户无缘无故地掉线。

Titas Norkūnas是DevOps咨询服务提供商Bear Mountain的联合创始人。由于看到Ruby/Rails社区忽略了Dormando那两篇文章所指出的问题,所以他近日撰文对此进行了进一步的阐述。他认为问题的根本在于,memcached是一个设计用于缓存数据而不是存储数据的系统,因此不应该用于存储Session



对于Dormando的那两篇文章,他认为第一篇文章给出的原因很容易理解,而人们经常会对第二篇文章给出的原因认识不足。因此他对这个原因进行了详细地阐述:

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

分享到:
评论

相关推荐

    session共享 memcached-session-manager 1.9.6 jar

    `memcached-session-manager`通过将用户的session数据存储在Memcached服务器上,而不是每个单独的Tomcat实例的内存中,实现了跨服务器的session共享。这意味着无论用户请求哪个服务器,他们的session数据都能被正确...

    memcached管理session资源

    完成上述配置后,Tomcat将使用MSM来管理session,将session数据透明地存储到Memcached中。通过这种方式,我们可以实现跨服务器的session共享,同时减轻服务器内存的压力,提高应用的性能和可扩展性。 在实际应用中...

    Memcached_Session_Manager jar

    **Memcached_Session_Manager jar** 是一个专为Tomcat服务器设计的组件,用于管理Web应用程序的会话(Session)。会话管理在多服务器环境,特别是集群环境中尤为重要,因为需要确保用户在集群中的任何一台服务器上都...

    tomcat8+memcached session共享

    2. `memcached-session-manager-1.8.3.jar`:这个库提供了session管理器,实现了将Tomcat的session数据存储到Memcached的能力。 3. `kryo-1.04.jar` 和 `kryo-serializers-0.11.jar`:Kryo是一个快速、高效的序列化...

    MSM--memcached session manager(memcached+tomcat7共享session所需jar包)

    MSM--memcached session manager是一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。对于非黏性Session,...

    memcached-session-manager

    2. **Java Servlet会话管理**:在Java Web开发中,Servlet规范定义了会话接口HttpSession,memcached-session-manager 是一个实现该接口的第三方库,允许开发者将默认的基于内存的会话存储替换为分布式存储。...

    memcached(十一)memcached-session-manager

    在这个教程中,重点可能是如何使用memcached来存储和管理Web应用中的session数据,以提高性能和可扩展性。 **描述解析:** 描述部分为空,但根据标题可以推测,该教程可能涵盖了如何配置和集成`memcached-session-...

    tomcat-7.0.54配合使用的memcached-session-manager1.6.1的整套jar包

    为了优化这个问题,我们可以使用`memcached-session-manager`,它是一个专门为Tomcat设计的插件,使得Tomcat能够将用户的session数据存储在Memcached服务器上,实现session的分布式管理。 本文将详细介绍如何在...

    memcached tomcat session 共享所需jar

    4. **couchbase-client-1.0.3.jar**:虽然标题和描述没有明确提到Couchbase,但这个jar可能是为了配合其他库使用,例如Couchbase也提供了一个Memcached协议兼容的接口,可以在某些场景下作为session的后端存储。...

    tomcat+memcached 管理session

    在`Tomcat`中,Session数据默认存储在服务器的内存中,这在多服务器集群环境下可能会导致Session不一致的问题。为了解决这个问题,我们可以利用`Memcached`实现Session复制与同步。具体步骤如下: 1. **配置Tomcat*...

    j2ee项目使用filter和memcached实现session服务器

    6. **跨服务器共享**:当用户在多个服务器之间跳转时,由于session存储在Memcached中,所以无论请求发送到哪个服务器,都能获取到相同的session信息。 通过这样的实现,你的J2EE项目就能够有效地利用Memcached来...

    tomcat8 memcached session共享jar包

    标题中的“tomcat8 memcached session共享jar包”指的是在Tomcat 8中使用Memcached作为session共享存储的解决方案。Memcached是一种分布式内存缓存系统,常用于减轻数据库负载,提高应用性能。在Tomcat这样的Java...

    memcached共享session需要的jar包

    标题中的“memcached共享session需要的jar包”指的是在分布式环境中使用Memcached作为session存储机制时所需的Java库。Memcached是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提升Web应用性能。在...

    memcached-session-manager-1.6.5.rar

    总的来说,Memcached Session Manager 1.6.5是一个高效、可靠的会话管理解决方案,它通过与Memcached的集成,为Java Web应用提供了强大的会话持久化和分布式管理能力,是现代高并发、大数据量场景下的理想选择。...

    memcached-session-manager_4_tomcat8

    "memcached-session-manager_4_tomcat8" 这个标题表明我们正在讨论一个针对Tomcat 8.0.33版本的session管理器,它使用了memcached作为持久化存储。memcached是一种分布式内存对象缓存系统,常用于减轻数据库负载,...

    memcached-session-manager-1.8.1

    2. **Session持久化**:每次session数据发生变化时,MSM都会自动更新存储在Memcached中的对应session数据,确保数据一致性。 3. **负载均衡**:MSM支持多种负载均衡策略,如轮询、最少连接等,确保session在多个...

    memcached-session-manager.rar

    MSM memcached session manager是一个高可用的Tomcat session共享解决方案 除了可以从本机内存快速读取Session信息 仅针对黏性Session 外 同时可使用memcached存取Session 以实现高可用 对于非黏性Session ...

    Tomcat memcached Session依赖jar包

    总之,"Tomcat memcached Session依赖jar包"涉及到的是在Tomcat中使用memcached来提升Session管理效率的技术。这需要正确配置Tomcat的Session Manager,并选择合适的序列化库,如Kryo,以实现高效的数据存储和传输。...

    Memcached-session-manager所需最新jar包-tomcat7-kryo序列

    在Memcached-session-manager中,Kryo被用来将Java对象高效地转换为字节序列,以便于在网络中传输和在Memcached中存储。Kryo的优势在于速度快,内存占用少,特别适合处理大量短生命周期的对象。 6. **jar包**:Java...

    memcached session共享所用到的jar包

    这些客户端库允许应用将session对象序列化并存储到memcached中,同时提供反序列化功能以在需要时恢复这些对象。 3. **Tomcat集成**:为了使这个过程在Tomcat服务器中工作,我们需要将对应的jar包(例如spymemcached...

Global site tag (gtag.js) - Google Analytics