整合Spring Boot与Redis以实现用户Token存储是一个常见的需求,尤其在需要高性能、低延迟的数据存储方案时。
一、准备工作
-
创建Spring Boot项目:使用Spring Initializr生成一个Spring Boot项目,并选择以下依赖:
- Spring Web
- Spring Data Redis
- Spring Boot DevTools (可选)
- Lombok (可选)
-
配置Redis环境:确保本地或远程环境中有一个运行中的Redis实例。如果没有,可以通过Docker快速安装:
docker run -d --name redis -p 6379:6379 redis
二、配置Spring Boot
-
添加依赖:在
pom.xml
文件中添加以下依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
配置Redis连接:在
application.properties
文件中添加Redis连接配置:spring.redis.host=localhost spring.redis.port=6379
三、定义用户Token实体类
使用Lombok简化代码,可以定义一个简单的用户Token实体类:
import lombok.Data;
import java.io.Serializable;
@Data
public class UserToken implements Serializable {
private String userId;
private String token;
private long expirationTime;
}
四、配置RedisTemplate
RedisTemplate是Spring Data Redis提供的操作Redis的核心类,下面是配置RedisTemplate的示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 使用String序列化
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
// 使用Jackson序列化
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
五、编写用户Token服务类
编写一个服务类来封装操作Redis的逻辑:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class UserTokenService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String TOKEN_PREFIX = "user:token:";
public void saveToken(UserToken userToken) {
String key = TOKEN_PREFIX + userToken.getUserId();
redisTemplate.opsForValue().set(key, userToken, userToken.getExpirationTime(), TimeUnit.MILLISECONDS);
}
public UserToken getToken(String userId) {
String key = TOKEN_PREFIX + userId;
return (UserToken) redisTemplate.opsForValue().get(key);
}
public void deleteToken(String userId) {
String key = TOKEN_PREFIX + userId;
redisTemplate.delete(key);
}
}
六、编写控制器
最后,编写一个控制器来处理用户Token的存储和获取:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/token")
public class UserTokenController {
@Autowired
private UserTokenService userTokenService;
@PostMapping
public void saveToken(@RequestBody UserToken userToken) {
userTokenService.saveToken(userToken);
}
@GetMapping("/{userId}")
public UserToken getToken(@PathVariable String userId) {
return userTokenService.getToken(userId);
}
@DeleteMapping("/{userId}")
public void deleteToken(@PathVariable String userId) {
userTokenService.deleteToken(userId);
}
}
七、测试
-
启动Spring Boot应用:确保Redis服务器已启动,然后运行Spring Boot应用。
-
测试保存Token:
curl -X POST -H "Content-Type: application/json" -d '{"userId":"123","token":"abc123","expirationTime":60000}' http://localhost:8080/api/token
-
测试获取Token:
curl http://localhost:8080/api/token/123
-
测试删除Token:
curl -X DELETE http://localhost:8080/api/token/123
结论
通过以上步骤,我们成功地将Spring Boot与Redis整合起来,实现了用户Token的存储、获取和删除。这个过程展示了如何利用Spring Data Redis和RedisTemplate简化Redis操作,并通过控制器提供RESTful API接口来处理用户Token的管理。