集群中关于会话信息的解决方案

一般有三种解决方案

  1. IP分流
  2. 会话复制
  3. 会话共享(推荐)

IP分流

这个技术我曾经在我的个人博客中用过,简单方便。

优点

  • 服务端代码不用变
  • Nginx只需要加个ip_hash的配置

缺点

  • 会破坏Nginx的负载均衡
  • 当某个服务器挂了的时候,服务器所在用户也会退出登录状态
  • 服务器重启时,用户需要重新登录

会话复制

这个我没用过,据说就是把session在所有服务器上都复制一份,且服务器数量太多时容易出问题,由于没用过,暂不讨论。

会话共享

既然是共享,共享到哪?当然是共享到redis了。

缺点

  • 实现麻烦

优点

  • 不会破坏负载均衡
  • 没有服务器节点的数量限制

拓扑图

实现

登录成功

  1. 生成一个定长的随机字符串作为JSESSIONID,当然了,随机字符串并不能保证唯一,所以在后面再加一个自增的数字,这个自增的数字可以放在redis中
  2. 用JSESSIONID作为key,用户信息作为value,有效期30分钟,存入redis
  3. 像客户浏览器中写入cookie,其key为“JSESSIONID”,value为JSESSIONID的值。

登录验证

  1. 从请求中找出key=“JSESSIONID”的cookie,用它的值作为key去redis中查找用户的登录信息。

验证码等用户零时信息

  1. 生成验证码
  2. 从请求中找出key=“JSESSIONID”的cookie,其实就是JSESSIONID
  3. 把验证码放入redis,他的key=JSESSIONID + “:code”,最好设置有效期

校验验证码

  1. 从请求中找出key=“JSESSIONID”的cookie,其实就是JSESSIONID
  2. 从redis中找出验证码,key=JSESSIONID + “:code”
  3. 用过之后删除redis中的验证码