吊打面试官之分布式会话
1、什么是分布式会话?
我认为就是在同一个系统中访问不同服务器能做到保留用户状态的一种机制(解决方案)。
场景: 一台tomcat时,肯定是不会出现什么问题。如果是A,B两台服务器呢?请求1先访问到A,A中存储了1的信息,当请求1访问B时,B中并没有1的信息。如何让A,B共享同一session呢?
**解决方案:**那就是在A,B中介入第三方,来存储这个session。
扩展链接: 来之简书的详细解答
2、有哪些分布式会话解决方案?
1. 客户端存储;
2. session复制;
3. session绑定;
4. 基于redis存储session方案(推荐);
3、为什么选择基于redis存储session方案?
3.1、客户端存储
解释: 直接将信息存储到cookie中
优点:
1、客户端通过http协议和服务器进行cookie交互 (快捷)
缺点:
1、数据存储在客户端,存在安全隐患
2、cookie存储大小、类型存在限制
3、数据存储在cookie中,如果一次请求cookie过大,会给网络增加更大的开销
3.2、session复制
解释: 一台服务器中如果获取到sesion就会复制到其他服务器
优点:
1、任何一台服务器宕机的时候不会影响另外服务器中session的状态 (独立)
2、配置相对简单 (简单)
缺点:
1、服务器多了,并发上来了,session需要同步的数据量就大 (网路开销)(内存不足)
3.3、session绑定
解释: 客户端和服务器进行绑定(基于nginx的ip-hash策略实现)
优点:
1、配置相对简单 (简单)
缺点:
1、如果该服务器宕机,session将消失 (存在消失风险)
2、前端不能有负载均衡,如果有,session绑定将会出问题 (扩展性弱)
3.4、基于redis存储session方案(重点)
解释: 使用redis来存储session
优点:
1、企业中运用广泛 (普及性搞)
2、数据保存在redis中,无缝接入,不存在任何安全隐患
缺点:
1、如果该服务器宕机,session将消失 (存在消失风险)
2、前端不能有负载均衡,如果有,session绑定将会出问题 (扩展性弱)
4、我是如何使用redis存储session的?
自定义token 存redis实现分布式会话
1. 登录成功后,后端自定义一个不会重复token(使用UUID)
2. 后端把这个token存到redis中,并且设置一下过去时间,并把token返给前端
3. 前端达到token存到session storage中
4. 前端隔几分钟就请求后端的token续期接口(也就是把redis存的token重置过期时间)
代码下载地址: 源码地址