整合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的管理。