使用Redis存储Spring Boot项目中的Session
在开发Spring Boot项目时,我们通常会遇到如何高效管理Session的问题。默认情况下,Spring Boot会将Session存储在内存中。但在分布式系统中,这种方式显然不太合适。今天,我们将学习如何将Session存储从内存切换到Redis,并验证配置是否成功。
步骤一:添加依赖
dependencies { implementation("org.springframework.boot:spring-boot-starter-data-redis") implementation("org.springframework.session:spring-session-data-redis") }
步骤二:配置Redis连接
接下来,我们需要在配置文件中添加Redis连接信息。你可以选择使用application.yml
或application.properties
文件。
示例:application.yml
spring: redis: host: localhost port: 6379 password: "" lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 server: servlet: session: store-type: redis # 使用Redis存储Session
示例:application.properties
spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.lettuce.pool.max-active=8 spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=0 server.servlet.session.store-type=redis # 使用Redis存储Session
步骤三:启用Spring Session
在主类中添加@EnableRedisHttpSession
注解,使Spring Boot能够使用Redis管理Session。
示例代码
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @SpringBootApplication @EnableRedisHttpSession public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
步骤四:检查和测试
完成配置后,重新启动你的Spring Boot应用程序,并进行以下验证:
方法一:使用Redis命令行客户端
- 连接到Redis服务器:
redis-cli -h localhost -p 6379
- 查询Session数据:
KEYS spring:session:sessions:*
- 查看具体Session数据:
HGETALL spring:session:sessions:<session-id>
方法二:使用Redis GUI工具
你可以使用Redis Desktop Manager、Medis或RedisInsight等图形界面工具,连接到Redis服务器并查看存储的Session数据。
方法三:在代码中查看
通过添加日志或调试信息,输出当前的Session ID和内容。
示例代码
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpSession; import java.util.Enumeration; @RestController public class SessionController { @Autowired private StringRedisTemplate redisTemplate; @GetMapping("/check-session") public String checkSession(HttpSession session) { String sessionId = session.getId(); Enumeration<String> attributeNames = session.getAttributeNames(); StringBuilder sessionData = new StringBuilder("Session ID: " + sessionId + "\n"); while (attributeNames.hasMoreElements()) { String attributeName = attributeNames.nextElement(); sessionData.append(attributeName).append(": ").append(session.getAttribute(attributeName)).append("\n"); } // 在日志中输出Session ID和内容 System.out.println(sessionData.toString()); // 检查Redis中是否存在该Session ID Boolean hasKey = redisTemplate.hasKey("spring:session:sessions:" + sessionId); return hasKey != null && hasKey ? "Session stored in Redis" : "Session not found in Redis"; } }
通过访问 /check-session
端点,可以查看当前Session的ID和内容,并确认是否成功存储在Redis中。