Redis实战-session共享

1,003 阅读1分钟

创建一个使用了srping的mavne项目,这里我们借助spring-session来实现。

添加依赖

         <!--redis的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--redis-session-->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

配置文件

#地址
spring.redis.host=
#端口
spring.redis.port=
#密码
spring.redis.password=
#库号
spring.redis.database=

启用Redis Http会话

@Configuration
@EnableRedisHttpSession
public class RedisSessionManager {
}

项目到这里就已经实现了Redis管理session了。

使用分析

接下来我们一起分析一段代码:

    @RequestMapping()
    public void test(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //现在操作的都是redis里面的session
        HttpSession session = request.getSession();
        List<String> list = (List<String>) session.getAttribute("list");
        if (list == null){
            list = new ArrayList<>();
            //放入redis
            session.setAttribute("list",list);
        }
        list.add("y2m");
        response.getWriter().println("size:"+list.size());
        response.getWriter().println("sessionId:"+session.getId());
    }

输出结果: 当你第一次访问的时候 会输出 size:1 ,第二次访问的时候 会输出 size:2, 第三次访问的时候 会输出 size:2 ,以后无论你访问多少次 都是输出 size:2

结果解读

当你第一次访问的时候这时候redis并没有session,得到的session是服务器的session对象及Java对象,这时候自然输出 size:1

当你第二次访问的时候这时候redis有session,得到的session是从redis里面拿到 list的size为1 进行add操作 size变为2 此时你并没有把新的list更新到redis的list,所以redis的list的size还是1

往后都是这样............

思考:那为什么不适用redis的session管理,下面的代码就有效呢?因为JVM管理的session在堆中的地址是不会变的 所以list在堆中的地址也不会变

代码优化

    /**
     * 解决楼上的方法就是 session每发生一次变化就放入redis,同步内容
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping()
    public void optimization(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //现在操作的都是redis里面的session
        HttpSession session = request.getSession();
        List<String> list = (List<String>) session.getAttribute("list");
        if (list == null){
            list = new ArrayList<>();
            //放入redis
            session.setAttribute("list",list);
        }
        list.add("y2m");
        //放入redis 同步
        session.setAttribute("list",list);
        response.getWriter().println("size:"+list.size());
        response.getWriter().println("sessionId:"+session.getId());
    }

    //移除session redis管理的话到redis移除
    request.getSession().invalidate();