使用Redis实现分布式会话

1. 概述

传统的单体应用中,用户是否登录,通常是通过从Tomcat容器的session中获取登录用户信息判断的。

但在分布式的应用中,通常负载均衡了多台Tomcat,每台Tomcat都有自己独立的session,用户的每次请求都可能到达不同的Tomcat,因此可能会出现需要登录多次或者登录无效的情况出现。

为了解决这个问题,就需要使用一个缓存中间件,将登录用户的信息存入这个缓存中间件,所有的Tomcat都从缓存中间件中获取登录用户信息,从而判断登录状态。

Redis就是一个很好用的缓存中间件,接下来我们就来聊聊分布式应用该如何实现用户登录的逻辑。

 

2. 单体应用的用户登录

传统的单体应用,通常只有一个Tomcat。

用户提交登录信息时,后台会根据用户登录名,得到用户信息,然后比对密码,如果正确,则将用户信息放入Tomcat的session中。

用户请求需要登录的接口时,先从Tomcat的session中得到用户信息,如果用户信息是null,则接口无法访问,提示用户登录。如果用户信息不为null,则使用用户信息完成接口逻辑。

 

3.分布式应用的用户登录

3.1 方案一:允许用户异地登录

用户提交登录信息时,后台根据用户登录名,得到用户信息,然后比对密码,如果正确,则生成一个随机数。

以这个随机数为key,用户信息为value,存入redis。

在cookie中存入一个固定值的key,例如:mySessionId,value为这个随机数。

 

用户请求需要登录的接口时,先从cookie中拿到随机数,然后以随机数为key,从redis中得到用户信息,如果用户信息不为null,则表示用户已登录。

 

用户注销登录时,将cookie中的随机数和redis中的用户信息都清空。

 

3.2 方案二:不允许用户异地登录(以新登录的为准)

用户提交登录信息时,后台根据用户登录名,得到用户信息,然后比对密码,如果正确,则生成一个随机数。

将这个随机数放入用户信息中,在cookie中存入一个固定值的key,例如:curUser,value是脱敏后的用户信息。

以用户ID为key,这个随机数为value,存入redis。

 

用户请求需要登录的接口时,先从cookie中拿到用户信息,然后以用户信息中的用户ID为key,从redis中得到随机数。

如果redis中随机数不存在,则表示没有登录,如果存在,使用redis中得到的随机数与cookie中用户信息中的随机数做对比,如果不一致,则表示用户在其他地方登录,需要重新登录。

 

用户注销登录时,将cookie中的用户信息和redis中的随机数都清空。

 

4.综述

今天简单聊了一下使用redis实现分布式会话,希望能对大家的工作有所帮助。

欢迎大家多多评论交流,共同成长。

关注追风人聊Java,每天更新Java干货。