为什么不能用 memcached 存储 Sesion
Memcached 创建者 Dormando 很早就写过两篇文章[1][2],告诫开发人员不要用
memcached 存储 Sesion。他在第一篇文章中给出的理由大致是说,如果用
memcached 存储 Sesion,那么当 memcached 集群发生故障(比如内存溢出)或
者维护(比如升级、增加或减少服务器)时,用户会无法登录,或者被踢掉线。
而在第二篇文章中,他则指出,memcached 的回收机制可能会导致用户无缘无故
地掉线。
Titas Norkūnas 是 DevOps 咨询服务提供商 Bear Mountain 的联合创始人。由于看
到 Ruby/Rails 社区忽略了 Dormando 那两篇文章所指出的问题,所以他近日撰文
对此进行了进一步的阐述。他认为问题的根本在于,memcached 是一个设计用于
缓存数据而不是存储数据的系统,因此不应该用于存储 Sesion。
对于 Dormando 的那两篇文章,他认为第一篇文章给出的原因很容易理解,而人
们经常会对第二篇文章给出的原因认识不足。因此他对这个原因进行了详细地阐
述:
Memcached 使用“最近最少使用(LRU)”算法回收缓存。但 memcached 的 LRU
算法针对每个 slab 类执行,而不是针对整体。
这意味着,如果所有 Sesion 的大小大致相同,那么它们会分成两三个 slab 类。
所有其它大小大致相同的数据也会放入同一些 slab,与 Sesion 争用存储空间。
一旦 slab 满了,即使更大的 slab 中还有空间,数据也会被回收,而不是放入更
大的 slab 中……在特定的 slab 中,Sesion 最老的用户将会掉线。用户将会开始
随机掉线,而最糟糕的是,你很可能甚至都不会注意到它,直至用户开始抱怨……
另外,Norkūnas 提到,如果 Sesion 中增加了新数据,那么 Sesion 变大也可能
会导致掉线问题出现。
有人提出将 Sesion 和其它数据分别使用单独的 memcached 缓存。不过,由于
memcached 的 LRU 算法是局部的,那种方式不仅导致内存使用率不高,而且也
无法消除用户因为 Sesion 回收而出现随机掉线的风险。
如果读者非常希望借助 memcached 提高 Sesion 读取速度,那么可以借鉴
Norkūnas 提出的 memcached+RDBMS(在有些情况下,NoSQL 也可以)的模式:
当用户登录时,将 Sesion “set”到 memcached,并写入数据库;
在 Sesion 中增加一个字段,标识 Sesion 最后写入数据库的时间;
每个页面加载的时候,优先从 memcached 读取 Sesion,其次从数据库读
取;
每加载 N 页或者 Y 分钟后,再次将 Sesion 写入数据库;
从数据库中获取过期 Sesion,优先从 memcached 中获取最新数据。
关于 memcached 的更多信息,可以查看这里。
分享到:
相关推荐
`memcached-session-manager`通过将用户的session数据存储在Memcached服务器上,而不是每个单独的Tomcat实例的内存中,实现了跨服务器的session共享。这意味着无论用户请求哪个服务器,他们的session数据都能被正确...
完成上述配置后,Tomcat将使用MSM来管理session,将session数据透明地存储到Memcached中。通过这种方式,我们可以实现跨服务器的session共享,同时减轻服务器内存的压力,提高应用的性能和可扩展性。 在实际应用中...
**Memcached_Session_Manager jar** 是一个专为Tomcat服务器设计的组件,用于管理Web应用程序的会话(Session)。会话管理在多服务器环境,特别是集群环境中尤为重要,因为需要确保用户在集群中的任何一台服务器上都...
2. `memcached-session-manager-1.8.3.jar`:这个库提供了session管理器,实现了将Tomcat的session数据存储到Memcached的能力。 3. `kryo-1.04.jar` 和 `kryo-serializers-0.11.jar`:Kryo是一个快速、高效的序列化...
2. **Java Servlet会话管理**:在Java Web开发中,Servlet规范定义了会话接口HttpSession,memcached-session-manager 是一个实现该接口的第三方库,允许开发者将默认的基于内存的会话存储替换为分布式存储。...
MSM--memcached session manager是一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。对于非黏性Session,...
在这个教程中,重点可能是如何使用memcached来存储和管理Web应用中的session数据,以提高性能和可扩展性。 **描述解析:** 描述部分为空,但根据标题可以推测,该教程可能涵盖了如何配置和集成`memcached-session-...
为了优化这个问题,我们可以使用`memcached-session-manager`,它是一个专门为Tomcat设计的插件,使得Tomcat能够将用户的session数据存储在Memcached服务器上,实现session的分布式管理。 本文将详细介绍如何在...
4. **couchbase-client-1.0.3.jar**:虽然标题和描述没有明确提到Couchbase,但这个jar可能是为了配合其他库使用,例如Couchbase也提供了一个Memcached协议兼容的接口,可以在某些场景下作为session的后端存储。...
在`Tomcat`中,Session数据默认存储在服务器的内存中,这在多服务器集群环境下可能会导致Session不一致的问题。为了解决这个问题,我们可以利用`Memcached`实现Session复制与同步。具体步骤如下: 1. **配置Tomcat*...
6. **跨服务器共享**:当用户在多个服务器之间跳转时,由于session存储在Memcached中,所以无论请求发送到哪个服务器,都能获取到相同的session信息。 通过这样的实现,你的J2EE项目就能够有效地利用Memcached来...
标题中的“tomcat8 memcached session共享jar包”指的是在Tomcat 8中使用Memcached作为session共享存储的解决方案。Memcached是一种分布式内存缓存系统,常用于减轻数据库负载,提高应用性能。在Tomcat这样的Java...
标题中的“memcached共享session需要的jar包”指的是在分布式环境中使用Memcached作为session存储机制时所需的Java库。Memcached是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提升Web应用性能。在...
总的来说,Memcached Session Manager 1.6.5是一个高效、可靠的会话管理解决方案,它通过与Memcached的集成,为Java Web应用提供了强大的会话持久化和分布式管理能力,是现代高并发、大数据量场景下的理想选择。...
"memcached-session-manager_4_tomcat8" 这个标题表明我们正在讨论一个针对Tomcat 8.0.33版本的session管理器,它使用了memcached作为持久化存储。memcached是一种分布式内存对象缓存系统,常用于减轻数据库负载,...
MSM memcached session manager是一个高可用的Tomcat session共享解决方案 除了可以从本机内存快速读取Session信息 仅针对黏性Session 外 同时可使用memcached存取Session 以实现高可用 对于非黏性Session ...
2. **Session持久化**:每次session数据发生变化时,MSM都会自动更新存储在Memcached中的对应session数据,确保数据一致性。 3. **负载均衡**:MSM支持多种负载均衡策略,如轮询、最少连接等,确保session在多个...
总之,"Tomcat memcached Session依赖jar包"涉及到的是在Tomcat中使用memcached来提升Session管理效率的技术。这需要正确配置Tomcat的Session Manager,并选择合适的序列化库,如Kryo,以实现高效的数据存储和传输。...
在Memcached-session-manager中,Kryo被用来将Java对象高效地转换为字节序列,以便于在网络中传输和在Memcached中存储。Kryo的优势在于速度快,内存占用少,特别适合处理大量短生命周期的对象。 6. **jar包**:Java...
nginx做负载均衡时session共享 ,使用memcached作为session储存需要的jar,日志地址:http://blog.csdn.net/haiking5253/article/details/23362675