分布式系统的Session共享——Redis实现

在以往的学习中,我们都只有一个Web服务器,所以服务端的Session除了进行数据交互外,不需要别的操作。但是分布式系统的出现,导致了Session必须要进行共享。

Session共享的意义:假设我们有一个电商网站,有一个购物车服务器和支付服务器,用户将商品添加到购物车之后,服务器将商品信息和用户信息保存到用户对应的session中,这样支付的时候就可以通过共享的session来完成支付。

而Token一般只保存少量用户信息用于跨域请求验证等操作,不能将所有的用户数据(用户信息和商品信息)放在token中,这样会导致token过大,增加请求验证需要的开销。

比如有一个电商分布式系统,有登录(web1)和购买(web2)两个模块。用户在登录了之后,用户的信息保存在了web1中,当用户需要购买的时候,由于web2的session没有用户信息,又需要重新登录,显然是不友好的交互方式,同时也存在了安全问题。解决这个问题就需要进行session共享,从而让用户只需要一次登录,就可以完成对多个系统的访问(用户不可见)。

主要用到3个技术,cookie、session、redis缓存数据库,简单介绍下这三种技术:

Cookie:

由于Http是一种无状态请求,所以用户在网页页面进行连续操作的时候,必须要让服务器知道是哪个用户在进行操作。而Cookie就可以实现这个功能。

cookie以键值对的形式存在,可以有多个值,但是只有一个键,保存于客户端,创建于服务器端。用户在第一次访问服务器的时候,服务器端会创建一个Cookie对象,并设置响应的信息。cookie对象会保存在http响应的响应头中返回到客户端,作为客户端的身份信息标识而存在。在客户端下一次进行请求的时候,cookie对象又会保存在http请求消息的请求头中发送到服务器端,让服务器知道自己是哪个用户。

Session:

类似于cookie,session是一个存在于服务器端,用于存储相关信息的对象。在浏览器发送请求到服务器端时,Web容器(Servlet)会创建一个session对象和sessionID,session以键值对形式存在(一个键只有一个值),session则作为和客户端进行交互的标识存才,一般会把sessionID保存在cookie对象中响应到客户端。客户端下次请求的时候就可以带着这个sessionID来操作session对象。

Redis:

Redis是一个基于缓存的非关系型数据库,具有读写速度高等特点。且其支持的哈希数据结构和session结构类似,所以可以用来存放sessionID和session对象。

整体解决方案如下:

分布式系统的Session共享——Redis实现_第1张图片

 

现在假定有一个客户,系统通能分为登录和购买两个部分,其中redis数据库存储session信息(正式项目中Redis数据库又分为主从数据库,主服务器负责写,从服务器负责读)

1、用户发送登录请求到服务器1,服务器1接受到请求后创建cookie对象(默认浏览器此时没有cookie对象)和Session对象,Session对象中存放用户登录信息,并获取SessionID将其作为cookie的值。

2、服务器操控Redis数据库创建名为SessionID,值为Session对象的数据信息。

3、服务器返回cookie对象和别的响应信息

4、用户访问服务器2,此时请求头中有值为SessionID的cookie对象和别的信息。

5、服务器通过拦截器拦截cookie中的SessionID,查无此Session,便去Redis数据库中查找

6、将查找结果返回给服务器2,服务器2创建对应的Session对象

7、将创建结果返回给客户端。

 

本人理解如上所述,如有不同见解,请评论指出。

你可能感兴趣的:(分布式系统的Session共享——Redis实现)