Redis实战-session共享 添加依赖 配置文件 启用

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

添加依赖

1
2
3
4
5
6
7
8
9
10
xml复制代码         <!--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>

配置文件

1
2
3
4
5
6
7
8
bash复制代码#地址
spring.redis.host=
#端口
spring.redis.port=
#密码
spring.redis.password=
#库号
spring.redis.database=

启用Redis Http会话

1
2
3
4
less复制代码@Configuration
@EnableRedisHttpSession
public class RedisSessionManager {
}

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

使用分析

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ini复制代码    @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在堆中的地址也不会变

代码优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
java复制代码    /**
* 解决楼上的方法就是 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());
}
1
2
scss复制代码    //移除session redis管理的话到redis移除
request.getSession().invalidate();

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%