如何做redis缓存登录springboot
时间: 2023-09-08 08:09:29 浏览: 98
在 Spring Boot 中使用 Redis 缓存登录的一般步骤如下:
1. 添加 Redis 依赖
在 pom.xml 文件中添加 Redis 的依赖,例如:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
```
2. 配置 Redis 连接信息
在 application.properties 或 application.yml 文件中配置 Redis 连接信息,例如:
```properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
```
3. 编写 Redis 配置类
在 Spring Boot 中,我们可以通过编写配置类来配置 RedisTemplate 和 StringRedisTemplate,例如:
```java
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
return new StringRedisTemplate(factory);
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
.RedisCacheManagerBuilder
.fromConnectionFactory(factory);
return builder.build();
}
}
```
其中,我们配置了 RedisTemplate 和 StringRedisTemplate 的序列化器为 Jackson2JsonRedisSerializer,这样可以方便地将对象序列化成 JSON 字符串存储到 Redis 中。
4. 在登录模块中使用 Redis 缓存
在登录模块中,我们可以使用 Redis 缓存用户信息。例如,我们可以将用户信息存储到 Redis 中,并设置一个过期时间,下次登录时如果 Redis 中存在该用户信息,则直接从 Redis 中获取,否则需要重新登录并将用户信息存储到 Redis 中。
```java
@Service
public class UserService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public User login(String username, String password) {
// 查询数据库,验证用户名和密码
User user = userRepository.findUserByUsernameAndPassword(username, password);
if (user != null) {
// 将用户信息存储到 Redis 中,并设置过期时间为 1 小时
redisTemplate.opsForValue().set("user:" + user.getId(), user, 1, TimeUnit.HOURS);
}
return user;
}
public User getUserById(Long userId) {
// 先从 Redis 中获取用户信息
User user = (User) redisTemplate.opsForValue().get("user:" + userId);
if (user == null) {
// 如果 Redis 中不存在该用户信息,则查询数据库,并将用户信息存储到 Redis 中
user = userRepository.findById(userId).orElse(null);
if (user != null) {
redisTemplate.opsForValue().set("user:" + userId, user, 1, TimeUnit.HOURS);
}
}
return user;
}
}
```
在上述代码中,我们使用 redisTemplate 对象来操作 Redis 缓存,其中:
- opsForValue() 方法用于操作 Redis 中的字符串类型数据;
- set() 方法用于将数据存储到 Redis 中;
- get() 方法用于从 Redis 中获取数据。
另外,我们还可以使用 @Cacheable 和 @CacheEvict 注解来更加方便地实现 Redis 缓存。例如:
```java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Cacheable(value = "user", key = "#userId")
public User getUserById(Long userId) {
return userRepository.findById(userId).orElse(null);
}
@CacheEvict(value = "user", key = "#user.id")
public void updateUser(User user) {
userRepository.save(user);
}
}
```
在上述代码中,我们使用了 @Cacheable 和 @CacheEvict 注解来实现 Redis 缓存。其中:
- @Cacheable(value = "user", key = "#userId") 表示将 getUserById 方法的返回值缓存到 Redis 中,缓存的 key 为 user:userId;
- @CacheEvict(value = "user", key = "#user.id") 表示将 updateUser 方法中传入的用户信息从 Redis 缓存中删除,缓存的 key 为 user:userId。
这样,我们就可以方便地使用 Redis 缓存登录信息了。
阅读全文