使用Redis存储Spring Boot项目中的Session
在开发Spring Boot项目时,我们通常会遇到如何高效管理Session的问题。默认情况下,Spring Boot会将Session存储在内存中。但在分布式系统中,这种方式显然不太合适。今天,我们将学习如何将Session存储从内存切换到Redis,并验证配置是否成功。
步骤一:添加依赖
首先,我们需要在项目中添加Redis和Spring Session的依赖。对于使用Gradle的项目,可以在build.gradle.kts
文件中添加以下依赖:
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中。