创建一个使用了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();