REDIS

Redis实战之session共享

当线上集群时候,会出现session共享问题。虽然Tomcat提供了sessioncopy的功能,但是缺点比较明显:1:当Tomcat多的时候,session需要大量同步到多台集群上,占用内网宽带2:同一个用户session,需要在多个Tomcat中都存在,浪费内存空间如果要替换掉Tomcat的session共享,替代方案应该满足:1:数据共享2:内存存储3:key\value结构基于Redis实

当线上集群时候,会出现session共享问题。

虽然Tomcat提供了session copy的功能,但是缺点比较明显:

1:当Tomcat多的时候,session需要大量同步到多台集群上,占用内网宽带

2:同一个用户session,需要在多个Tomcat中都存在,浪费内存空间

如果要替换掉Tomcat的session共享,替代方案应该满足:

1:数据共享

2:内存存储

3:key\value结构

32513e73b243ec122ea183b9683cc5de.png

基于Redis实现共享session登录

本文由凯哥Java(gz#h:kaigejava),个人blog:www#kaigejava#.com。发布于凯哥Java个人blog

再来回顾下将验证码保存在session中业务流程

0f7ad2613d0c2945a3521a444ac48373.png

我们在session中存放的是:session.setAttribute("code", code); 因为session的特点,每次访问都是一个新的sessionId.我们可以直接使用code作为key.思考:那么如果换成了Redis,还能使用code作为可以吗?

 

将用户信息存放在session中流程:

949a02a0dc7a161f878989367a1dc0a0.png

用户信息在session中存放:session.setAttribute("user", user); 同样思考:那么如果换成了Redis,还能使用user作为可以吗?

将code和user信息存放在Redis中,流程如下:

c1fb88b9bdb73463963897e7f29433bf.png

验证码数据结构是:string类型的

用户对象数据类型是:hash类型的

根据上面分析,我们修改原来代码:

需要考虑的是:Redis的key规则、过期时间

1:发送验证码的时候,将验证码存放到Redis中时候,需要考虑过期时间。其核心代码如下:

6a6187b3f0126a1ec1705e9ace4ca0a6.png

stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);

2:用户登录的时候,将校验验证码以及用户信息存放到Redis中后,返回token

需要考虑的:

1:token不能重复

2:用户过期时间

3:登录成功后,要将token返回给前端

4:用户只要访问,Redis中的过期时间就要延长-在拦截器中处理的

用户登录核心代码修改:

e44e9661d6e2f3d8f501dba50a448535.png

//2.1:校验验证码是否正确
        //String code = (String) session.getAttribute("code");
        String code = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
        if (StringUtils.isEmpty(code) || !code.equals(loginForm.getCode())) {
            return Result.fail("验证码错误!");
        }
        //2.2:根据手机号查询,如果不存在,创建新用户
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("id", "phone", "ni

原创不易,完成人机校验,阅读全文

相关推荐