📌 사용 계기
Redis 만료시간 설정을 사용해서 저장해 놓은 reflesh token을 일정 시간이 지나면 자동으로 삭제할 필요가 있었다. 사용할 수 있는 가장 기본적인 예시로 방법을 정리
📍공통적으로 사용한 Redis Configuration
@EnableRedisRepositories
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
return lettuceConnectionFactory;
}
@Bean
public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
📌 1) Redis Template Set 설정 방법
: Strings (기본적인 key-value)자료구조로 저장하며, 저장하는 오퍼레이션 실행시 만료시간을 설정하는 방법.
📍저장 객체
@RedisHash(value = "redis")
public class RedisTemplateEntity {
private String email;
private String testText;
}
📍Repository
@Repository
@RequiredArgsConstructor
public class RedisTemplateRepository {
private final RedisTemplate<String, String> redisTemplate;
private long expireTime = 60;
public String saveValue (String email, String testText) {
// Point!TimeUnit을 통해 만료시간 단위 변경 가능
redisTemplate.opsForValue().set(email, testText, expireTime, TimeUnit.MINUTES);
return redisTemplate.opsForValue().get(email);
}
public void deleteValue (String email) {
redisTemplate.delete(email);
}
}
📍사용
// 사용 테스트만을 위한 컨트롤러라 서비스로 나누지 않음
@RestController
@RequiredArgsConstructor
public class RedisTemplateController {
private final RedisTemplateRepository redisTemplateRepository;
// 저장
@PostMapping("/testValue")
public String saveTestValue (@RequestBody RedisTemplateDto redisTemplateDto){
return redisTemplateRepository.saveValue(redisTemplateDto.getEmail(), redisTemplateDto.getTestText());
}
// 수정 : Redis는 같은 key값의 데이터를 쓰게되면 기존 데이터위에 덮어쓰게됨. 그래서 save나 update나 방식이 동일
@PostMapping("/testValue/{email}")
public String updateTestValue (@RequestParam String email, @RequestBody RedisTemplateDto redisTemplateDto){
return redisTemplateRepository.saveValue(email, redisTemplateDto.getTestText());
}
// 삭제
@DeleteMapping("/testValue/{email}")
public void deleteTestValue (@RequestParam String email) {
redisTemplateRepository.deleteValue(email);
}
}
📌 2) Crud Repository 설정 방법
: 저장하는 객체 자체에 만료시간을 설정해주는 방법. 객체 @RedisHash 어노테이션에 timeToLive 만료시간을 설정
📍저장 객체
@Getter
@RedisHash(value = "REDIS_USE", timeToLive = 5*60L) // Point! 기본 초단위
public class RedisCrudUseEntity {
@Id
private Long id;
private String testText;
@Builder
public RedisCrudUseEntity(Long id, String testText) {
this.id = id;
this.testText = testText;
}
}
📍Repository
@Repository
public interface RedisCrudUseRepository extends CrudRepository<RedisCrudUseEntity, Long> {
}
📍사용
// 사용 테스트만을 위한 컨트롤러라 서비스로 나누지 않음
@RestController
@RequiredArgsConstructor
public class RedisCrudUseController {
private final RedisCrudUseRepository redisCrudUseRepository;
// 저장
@PostMapping("/redisCrudUse")
public void saveRedisCrudUse (@RequestBody RedisCrudUseDto redisCrudUseDto) {
RedisCrudUseEntity redisCrudUseEntity = RedisCrudUseEntity.builder()
.id(redisCrudUseDto.getId())
.testText(redisCrudUseDto.getTestText())
.build();
redisCrudUseRepository.save(redisCrudUseEntity);
}
// 수정 : Redis는 같은 key값의 데이터를 쓰게되면 기존 데이터위에 덮어쓰게됨. 그래서 save나 update나 방식이 동일
@PostMapping("/redisCrudUse/{id}")
public void updateRedisCrudUse (@PathVariable Long id, @RequestBody RedisCrudUseDto redisCrudUseDto) {
RedisCrudUseEntity redisCrudUseEntity = RedisCrudUseEntity.builder()
.id(id)
.testText(redisCrudUseDto.getTestText())
.build();
redisCrudUseRepository.save(redisCrudUseEntity);
}
// 삭제
@DeleteMapping("/redisCrudUse/{id}")
public void deleteRedisCrudUse (@PathVariable Long id) {
redisCrudUseRepository.deleteById(id);
}
}
➕ 실습 레포지토리
GitHub - littlezero48/Study-TIL: Tody I learned
Tody I learned. Contribute to littlezero48/Study-TIL development by creating an account on GitHub.
github.com
'Database > Redis' 카테고리의 다른 글
Redis] Redis Repository를 Bean으로 생성 안되는 문제 (0) | 2023.01.13 |
---|