참고) https://developer-nyong.tistory.com/21
spring:
data:
redis:
host: localhost
port: 6379
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
// Redis 연결 팩토리 설정
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
// RedisTemplate 설정
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
// 일반적인 key:value의 경우 시리얼라이저
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
// json으로 변경
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// Hash를 사용할 경우 시리얼라이저
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
// 모든 경우
redisTemplate.setDefaultSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
메서드 명 || 레디스 타입
opsForValue || String
opsForList || List
opsForSet || Set
opsForZSet || Sorted Set
opsForHash || Hash
// 자바 map.putIfAbsent()랑 똑같이 없으면 넣고 있으면 false를 반환하는 식도 할 수 있다
public Boolean lock(Long key) {
return redisTemplate
.opsForValue()
.setIfAbsent(generateKey(key), "lock", Duration.ofMillis(3_000));
}
// 1씩 올리는 것도 가능
redisTemplate.opsForZSet().add(KEY,keyword,1);
redisTemplate.opsForZSet().incrementScore(KEY,keyword,1);
redisTemplate.opsForZSet().incrementScore(KEY,keyword,1);
@RedisHash("refreshTokenEntity")
@Getter
@NoArgsConstructor
@ToString
public class RefreshTokenEntity implements Serializable {
@Id
private String id;
private String loginId;
@Column(length = 512)
@Indexed
private String refreshToken;
@TimeToLive
private Long ttl;
public RefreshTokenEntity(String loginId, String refreshToken) {
this.id = UUID.randomUUID().toString();
this.loginId = loginId;
this.refreshToken = refreshToken;
this.ttl = JwtVO.REFRESH_TOKEN_EXPIRES_TIME;
}
}
public interface RefreshTokenRepository extends CrudRepository<RefreshTokenEntity, String> {
Optional<RefreshTokenEntity> findByRefreshToken(String refreshToken);
@Transactional
void deleteByRefreshToken(String refreshToken);
Boolean existsByRefreshToken(String refreshToken);
}
@Test
@DisplayName("RedisRepository를 활용")
void redis_repository_test() throws Exception {
RefreshTokenEntity refreshTokenEntity = new RefreshTokenEntity("hi", "123");
refreshTokenRepository.save(refreshTokenEntity);
Optional<RefreshTokenEntity> byRefreshToken = refreshTokenRepository.findByRefreshToken("123");
RefreshTokenEntity refreshTokenEntity1 = byRefreshToken.get();
System.out.println("refreshTokenEntity1 = " + refreshTokenEntity1)
;
}
@Bean
public RedisTemplate<String, Object> redisTEmplate(){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
private final RedisTemplate<String, Object> redisTemplate;
@Transactional
public void saveRefreshToken(String key, Object value) {
redisTemplate.opsForValue().set(key, value, JwtVO.REFRESH_TOKEN_EXPIRES_TIME, TimeUnit.MILLISECONDS);
}
public Object getRefreshToken(String key) {
return redisTemplate.opsForValue().get(key);
}
public void deleteToken(String key) {
redisTemplate.delete(key);
}
public boolean existsByRefreshToken(String refreshToken) {
return true;
}