通过memcached 共享session

血红的双手。 提交于 2020-03-01 17:36:14

当系统越来越大的时候,web系统可能会需要多台机器来响应用户请求,但是多台服务器因为物理的隔离,当一个用户前一个请求被响应到a机器,后面一个请求被响应到b机器,就会出现登陆态保持问题,一般解决方案有以下三种:

  • session同步:一台机器session变化,同步到另外几台机器上,从而实现不管跳转到哪台机器上看到的session是一致的。但是同步操作复杂,一致性难以保持,占用总体内存。

  • 有状态的跳转:就是一个用户可以通过ip,或者特定的数值来hash到固定的一台机器上。简单,但是负载均衡起到了它不应该起到的作用,负载有状态。

  • 共享同一个session:所有系统到一个服务器上获取session。就是我的这个工具的作用,把session信息写到memcached服务器上,而不是直接写到内存里。http://git.oschina.net/dengdai68/hsession

使用非常简单,只要把hsession.jar放到项目里,然后在web.xml加入 filter

###hsession介绍 hsession是一个解决j2ee 项目session共享问题的一个小工具,能够让同一个用户请求被转发到多台web服务器时,回话依然有效。 ###web.xml配置

<!-- 此过滤器 放在filter的最上面,否则可能 在此 filter 上面的filter 获取的session
  不是从memcache获取的,如果上面的filter 没有用到session则不影响-->
  <filter>
    <filter-name>sessionFilter</filter-name>
    <filter-class>com.hsession.filter.HSessionFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

###cache.properties配置

#cache类型,可以使用自己写的其他类来实现com.hsession.cache.Cache
cache.type=com.hsession.memcached.MemCached
#memcached 缓存ip:port ,用,分隔 使用分布式memcache服务器
cache.servers=121.43.106.57:11211
cache.server.weights=10

###Maven第三方依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.7</version>
</dependency>
<dependency>
    <groupId>com.whalin</groupId>
    <artifactId>Memcached-Java-Client</artifactId>
    <version>3.0.0</version>
</dependency>

但是hsession可能会遇到的问题,需要考虑:

  • 分布式memcached服务器是通过hash算法来分别落到不同的服务器上,如果一台memcached服务器的down机可能造成一批用户的登陆态丢失,需要重新登录。
  • memcached 分块存储,如果优化不好可能会在成大量的内存浪费 或者数据丢失
  • memcached不是一个稳定的数据存储服务器,可能会出现不确定的数据丢失,用户可能会莫名其妙下线,作为优化,可以用数据库作为辅助,或者直接使用redis
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!