`
qianshangding
  • 浏览: 127211 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用memcached实现session远程分布式存储

 
阅读更多

为了使web应用能使用saas模式的大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一, tomcat等多数服务都采用了session复制技术实现session的共享.

   session复制技术的问题:

   (1)技术复杂,必须在同一种中间件之间完成(如:tomcat-tomcat之间).

   (2)在节点持续增多的情况下,session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时,性能下降更加显著.这种特性使得web应用的水平扩展受到了限制.

 

   session共享的另一种思路就是把session集中起来管理,首先想到的是采用数据库来集中存储session,但数据库是文件存储相对内存慢了一 个数量级,同时这势必加大数据库系统的负担.所以需要一种既速度快又能远程集中存储的服务,所以就想到了memcached.

 

memcached是什么?

  memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

memcached能缓存什么?

  通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

memcached快么?

  非常快。memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O, 对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。

Danga Interactive为提升Danga Interactive的速度研发了memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这 些,是由一个由web服务器和数据库服务器组成的集群完成的。memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看 页面的速度、更好的资源分配方式,以及memcache失效时对数据库的访问速度。

memcached的特点

  memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

 

  使用memcached来存储session有两种方案:

(1)直接通过tomcat6的扩展机制实现.

  参考: http://www.javaeye.com/topic/81641

(2)通过自己编写filter实现.

考虑到系统的扩展,我们采用这种方案.这样可以使session共享机制和中间件脱钩.

 参考: http://www.javaeye.com/topic/82565

主要思路:

(1)继承重构HttpServletRequestWrapper,HttpSessionWrapper类,覆盖原来和session存取相关的方法呢,都通过SessionService类来实现.

(2)使用filter拦截cookie中的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用.

(3)SessionService连接memcached服务,以sessionId作为key,存取的对象是一个map.map的内容即为session的内容.

 

使用过程注意几个问题和改进思路:
1、memcache的内存应该足够大,这样不会出现用户session从Cache中被清除的问题(可以关闭memcached的对象退出机制)。
2、如果session的读取比写入要多很多,可以在memcache前再加一个Oscache等本地缓存,减少对memcache的读操作,从而减小网络开销,提高性能。
3、如果用户非常多,可以使用memcached组,通过set方法中带hashCode,插入到某个memcached服务器

 

对于session的清除有几种方案:

(1)可以在凌晨人最少的时候,对memcached做一次清空。(简单)

(2)保存在缓存中的对象设置一个失效时间,通过过滤器获取sessionId的值,定期刷新memcached中的对象.长时间没有被刷新的对象自动被清除.(相对复杂,消耗资源)

分享到:
评论

相关推荐

    memcached实现session远程分布式存储

    为了使web应用能使用saas模式的大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一, tomcat等多数服务都采用了session复制技术实现session的共享

    改进基于filter的远程分布式session存储

    1. **Session复制**:当用户的请求被Filter捕获时,Filter可以负责将当前Session的状态复制到分布式存储中,如Redis或Memcached,确保多台服务器间的数据同步。 2. **Session粘滞性**:为了减少网络延迟,可以采用...

    tomcat7集群实现session共享

    4. **基于缓存的解决方案**,如**Memcached**或**Redis**:这些分布式缓存系统可以存储session,为所有Tomcat实例提供中心化的session存储。它们通常具有高性能和可扩展性,但需要额外的配置和维护。 在实施session...

    Session丢失的原因及解决办法

    Memcached是一种分布式缓存机制,可以存储session信息。使用Memcached需要安装Memcached服务端和客户端,然后,在web.config文件中配置Memcached的连接字符串。 Session丢失的问题可以通过增加硬件配置、使用第三方...

    Linxu下配置Memcached

    关于session共享,Memcached可以作为一个有效的session存储解决方案,特别是在分布式环境中。在Java Web应用中,你需要配置Tomcat或你使用的其他Servlet容器,指定使用Memcached作为session存储。这通常涉及到修改...

    秒杀项目之服务调用&分布式session对应的完整项目

    5. **分布式Session中间件**:例如Redis或Memcached,作为中央Session存储,所有服务通过统一的Key-Value接口访问Session。这种方式能有效解决分布式环境下的Session一致性问题。 总结起来,秒杀项目的服务调用和...

    memcached应用疑惑

    memcached是一种高性能的分布式...如果不使用telnet或其他安全措施,memcached就易于被远程访问,可能会带来安全风险。因此,在生产环境中部署时,需要综合考虑业务需求、系统资源和安全因素来决定是否采用memcached。

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    "tomcat9+tomcat-cluster-redis-session-manager_4.0.zip"这个文件组合涉及到的是在Tomcat 9上实现负载均衡以及使用Redis作为Session管理器的高级配置。 首先,Tomcat 9是Apache Tomcat服务器的一个版本,它是Java ...

    tomcat集群session共享

    为了提高效率,可以考虑使用更高级的session管理解决方案,如使用共享存储或分布式缓存服务(如Redis、Memcached)来存储session数据。 总之,实现Tomcat集群session共享是一个涉及多个组件配置的过程,需要细心...

    JAVA分布式程序设计教程

    NoSQL数据库如MongoDB、Cassandra和HBase提供了非关系型的数据存储解决方案,而分布式键值存储如Redis和Memcached则常用于缓存。 8. **分布式计算**:Apache Hadoop和Spark是分布式计算框架的代表,它们用于处理大...

    分布式架构学习路线1

    分布式Session解决方案如Redis、Memcached或特定的Session管理库,将Session数据存储在集中式存储中,确保所有服务器都能访问。 总结来说,分布式架构的学习路线涵盖了多个核心组件和技术,旨在构建可扩展、健壮和...

    springboot+dubbo分布式框架

    1. **分布式缓存**:例如Redis或Memcached,用于存储热点数据,减少数据库访问,提高系统性能。 2. **分布式锁**:在多节点环境下解决并发问题,如Redis分布式锁、Zookeeper分布式锁等。 3. **分布式Session**:通过...

    分布式JAVA应用+基础与实践

    为了提高性能和响应速度,分布式缓存如Redis、Memcached和Hazelcast被广泛应用于Java分布式系统中。它们可以存储热点数据,减少数据库的压力,并提供高并发下的快速访问。 9. 分布式服务治理 Spring Cloud和Dubbo等...

    企业架构队列缓存中间件分布式Redis部署运维开发手册

    - **Session共享存储**:将用户的会话数据存储在Redis中,以便实现跨服务器之间的Session共享。 - **OpenResty动态限制IP访问**:结合OpenResty(一种基于Nginx的高性能Web平台)实现动态限制IP访问的功能,从而有效...

    PHP实现多服务器session共享之NFS共享的方法

    对于使用PHP语言开发的应用程序而言,实现多服务器之间的Session共享通常有多种解决方案,例如通过数据库、Memcached或Redis等方式存储Session数据。而本文将重点介绍一种基于NFS(Network File System)网络文件...

    PHP实例开发源码—PHPDisk php网盘系统(V-Core)GBK版.zip

    2. **文件存储**:系统可能使用了某种文件存储策略,如本地文件系统、云存储服务(如Amazon S3或Google Cloud Storage)或者分布式文件系统。文件路径管理、权限控制和存储优化是关键部分。 3. **用户管理**:...

    cluster模式潜在问题

    这可以通过会话复制、 sticky session 或者使用分布式会话存储(如Redis或Memcached)来实现。 3. **状态同步**:集群中的各个节点需要保持状态同步,以确保所有节点对系统状态有相同的认知。这可能涉及配置文件的...

    Java软件开发工程师面试题宝典.doc

    - **优化方案**:使用分布式Session,如Redis。 **1.22 缓存技术** - **Ehcache**:本地缓存解决方案。 - **Memcached**:分布式缓存服务。 **1.23 SQL优化** - **查询优化**:合理使用索引、减少子查询等。 - *...

    java开源包3

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

Global site tag (gtag.js) - Google Analytics