session共享解决方案

时间:2022-06-01 18:23:12

用户通过浏览器访问服务器的时候,服务器会自动产生session,用来存放用户信息,登录信息等内容,在分布式的系统中,如何保证session的一致性呢?

  • 方法一:session同步

    这个很好解释,也就是每新生成一个session,我们都把他同步到所有的服务器上面,这样每台服务器都有所有用户的session了,这是一种解决方法

    优点:实现思路简单

    缺点:

    1. 占用带宽,也就是每次都要去同步session,当服务器多的时候情况会很明显
    2. 占用内存,每台服务器都要存储所有的session,当session多的时候情况会很明显
  • 方法二:客户端存储

    用客户端来存放用户信息,登录信息等内容,下次请求的时候携带过来就行了,也是一种实现方法

    优点:服务端不用存储

    缺点:

    1. 安全性下降:cookie容易被窃取
    2. 存储数据量小,不同浏览器允许的cookie大小有限。
  • 方法三:一致性hash

    使用一致性hash算法计算出每个session存放的服务器,例如使用IP来做一致性hash,那么这个IP对应的session存放在哪一台服务器就确定了

    优点:

    1. 工作量小,不需要更改代码,只要配置nginx就可以了
    2. 支持水平扩展

    缺点:

    1. 当新水平扩展的时候,要从新计算hash值,用户需要重新登录
    2. 服务器重启,数据丢失
  • 方法四:后台统一存储

    把session存放到数据库或缓存中

    优点:

    1. 安全性高:即便重启了数据依然存在
    2. 水平扩展:因为session是单独存储的,所以不影响水平扩展

    缺点:

    1. 代码改动量大:当然如果一开始就使用的话,也是很简单的
    2. 增加了一次服务调用

目前公司在使用的是redis中的session共享,使用redis的好处是速度快而且支持持久化。