web服务器集群(多台web服务器)后session如何同步和共享

在访问量上去之后,不少人会采用web集群的方式在知足逐渐增加的用户量。这时候就不得不面对一个问题,那就是在多个服务器下,每次请求都会由于负载均衡而分配到不一样的服务器上。用户在登陆服务器后,下一次请求被分配到另外一个服务器上,这时候session不一样步,用户就没法继续使用原先的session。下面我就聊聊如何解决这个问题。mysql

1、利用Mysql数据库共享Session数据的方式web

使用一个mysql服务器作共享服务器,把全部的session的数据保存mysql服务器上,全部的web服务器都来这台mysql服务器来获取session数据。这里有一个关键的地方,用来存放session的数据表不要跟其余数据库表放在一块儿,要独立开来,专门放在一个低端的服务器上面。否则,数据库自己压力就很大了,再加上session是须要频繁的读取的,这使得数据库很容易达到瓶颈,从而致使太高的响应延迟。redis

2、利用cookie共享Session数据sql

当用户请求后产生的session,咱们把他的sessionId和值都存在cookie里面。这样,当你访问a服务器后,产生了session放在客户端的cookie里面,你在访问被分配到b服务器上。这时候,b服务器先判断自己服务器上有没有这个用户的session,若是没有,在去看看客户端的cookie里面有没有这个session,若是有,就获取客户端的这个cookie里面的session。这样就实现了session的同步。数据库

3、使用内存来共享Session数据缓存

这里建议能够选择采用开源的缓存系统来完成session的共享,好比memcache等。原理跟mysql同样,无论哪一个服务器产生的session都放在一个"内存池"里面。要获取session数据的时候都统一到这里获取。我建议用这个方法。服务器

//使用当前sessionId 标识做为key用来缓存当前用户的userId,openId,
        // 防止用户在使用过程当中切换网络致使服务器切换跳404页面
        String redisCurrentUserIdAndOpenIdKey = RedisUtil.getRedisCurrentUserIdAndOpenIdKey(request.getSession().getId());
        Map<String,String> currentUserIdAndOpenIdMap = new HashMap<String,String>();
        currentUserIdAndOpenIdMap.put(WebappCommonConstant.OPEN_ID, openId);
        currentUserIdAndOpenIdMap.put(WebappCommonConstant.USER_ID, String.valueOf(userId));
        redisBiz.insertMapToRedis(redisCurrentUserIdAndOpenIdKey,currentUserIdAndOpenIdMap,WebappCommonConstant.FREE_LOGIN_TIME);
相关文章
相关标签/搜索