现在我们的服务器很多都是同一个服务部署多个,或者部署在不同服务器上面,架设成集群,实现负载均衡。那么问题来了。当同一个用户登入后,再次访问可能分发到不同的服务,这样我们就取不到之前登入session,出现未登入现象。所以我们必须解决共享session问题。


  方式一:

      存储在数据库中 , 用户登入时,把session信息储存在数据库中,然后再需要获取session的地方进行读取。

              优点:开发简单  

              缺点 :依赖性太强,业务量大的时候数据库压力大,数据库出现问题影响整个系统。

 

   方式二 :

cookie 共享session ;当用户登入时,把 cookie储存在客户端,当用户需要session判断是否登入时,首先判断本服务器是否有session,如果没有同步cookie信息。(购物车在数据库和cookie都存,就是为了把用户未登入时产生的购物车同步到登入用户上)

                优点:用起来方便,开发效率高

                缺点 : cookie安全性不高,容易伪造,当客户端禁用时则该方法失效

   方式三  :

   服务器共享session ,使用一台作为用户的登录服务器,当用户登录成功之后,会将session写到当前服务器上,我们通过脚本或者守护进程将session同步到其他服务器上,这时当用户跳转到其他服务器,session一致,也就不用再次登录。

             优点:安全 ,一次配置永久使用

             缺点 ; 同步效率低,慢 ,有时出现没同步现象

     方式四  :

通过缓存同步session,用户登入时,把登入信息放在redis或者memcache中,我们取session信息的时候都从缓存中取。(重写session创建 获取 销毁 方法 创建存缓存中  获取从缓存中获取  销毁缓存中记录和服务器记录)

          优点: 比前几种方式效率高  读取速度快  安全

          缺点 :重写底层方法复杂 ,开发慢  

方式五:

nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的

     


upstream nginx.example.com
{
    server 127.0.0.1:8080;
    server 127.0.0.1:808;
    ip_hash;
}
server
{
    listen 80;
    location /
    {
        proxy_pass
        http://nginx.example.com;
    }
}


             优点:不用更改代码,能直接服务器端配置,方便快捷。

             缺点:这样有的时候不能起到分布式缓解服务器压力作用,可能同一个IP会有大量请求出现