使用redis快速实现session共享,springboot

时间:2022-11-28 10:54:37

1.引入依赖

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

在上面的示例中,除了引入Redis组件外,还需要引入spring-session-data-redis依赖。通过此组件实现Session信息的管理。

2.添加session配置类

package com.yangjunbo.JPADemo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}

使用redis快速实现session共享,springboot上面的示例配置了Session的缓存时间。maxInactiveIntervalInSeconds用于设置Session的失效时间,使用Redis共享Session之后,原Spring Boot的server.session.timeout属性不再有效。经过上面的配置后,Session调用就会自动去Redis上存取。另外,想要达到Session共享的目的,只需要在其他系统上进行同样的配置即可。

3.验证测试

创建测试类


package com.yangjunbo.JPADemo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.UUID;

@RestController
@RequestMapping()
public class Controller {

    @RequestMapping("/uid")
    String uid(HttpSession session) {
        UUID uid = (UUID) session.getAttribute("uid");
        if (uid == null) {
            uid = UUID.randomUUID();
        }
        session.setAttribute("uid", uid);
        return session.getId();
    }
}


然后,启动项目,运行一个程序实例,启动端口号为8080,在浏览器中输入地址:http://localhost:8080/uid,页面返回会话的sessionId。
使用redis快速实现session共享,springboot
我们可以登录Redis客户端,查看Session是否已经保存到Redis,输入“keys ‘sessions’”查看所有的Session信息,如图所示。
一般mac上redis的安装目录 /usr/local/opt/redis/bin/redis-server /usr/local/etc/redis.conf
使用redis快速实现session共享,springboot从上面的输出可以看到,sessionId是5c7b3e44-1695-4d2d-9955-a8ec80309eaa,与页面返回的sessionId一致。说明Redis中缓存的SessionId和实际使用的Session一致,Session已经在Redis中进行了有效的管理。

最后,模拟分布式系统再启动一个程序实例,启动端口号为8001,在浏览器中输入http://localhost:8001/uid,页面返回会话的SessionId如图所示。
使用redis快速实现session共享,springboot使用redis快速实现session共享,springboot

从输出结果可以看到,程序实例1和程序实例2获取的是同一个Session,这说明两个程序实现了Session共享。

参考书籍 《springboot从入门到实战-章为忠著》