用户通过浏览器访问服务器的时候,服务器会自动产生session,用来存放用户信息,登录信息等内容,在分布式的系统中,如何保证session的一致性呢?
-
方法一:session同步
这个很好解释,也就是每新生成一个session,我们都把他同步到所有的服务器上面,这样每台服务器都有所有用户的session了,这是一种解决方法
优点:实现思路简单
缺点:
- 占用带宽,也就是每次都要去同步session,当服务器多的时候情况会很明显
- 占用内存,每台服务器都要存储所有的session,当session多的时候情况会很明显
-
方法二:客户端存储
用客户端来存放用户信息,登录信息等内容,下次请求的时候携带过来就行了,也是一种实现方法
优点:服务端不用存储
缺点:
- 安全性下降:cookie容易被窃取
- 存储数据量小,不同浏览器允许的cookie大小有限。
-
方法三:一致性hash
使用一致性hash算法计算出每个session存放的服务器,例如使用IP来做一致性hash,那么这个IP对应的session存放在哪一台服务器就确定了
优点:
- 工作量小,不需要更改代码,只要配置nginx就可以了
- 支持水平扩展
缺点:
- 当新水平扩展的时候,要从新计算hash值,用户需要重新登录
- 服务器重启,数据丢失
-
方法四:后台统一存储
把session存放到数据库或缓存中
优点:
- 安全性高:即便重启了数据依然存在
- 水平扩展:因为session是单独存储的,所以不影响水平扩展
缺点:
- 代码改动量大:当然如果一开始就使用的话,也是很简单的
- 增加了一次服务调用
目前公司在使用的是redis中的session共享,使用redis的好处是速度快而且支持持久化。