现在我们的服务器很多都是同一个服务部署多个,或者部署在不同服务器上面,架设成集群,实现负载均衡。那么问题来了。当同一个用户登入后,再次访问可能分发到不同的服务,这样我们就取不到之前登入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会有大量请求出现