인프런 커뮤니티 질문&답변
[수업자료 문의] RedisTemplate으로 SETNX 시 리턴값 문의
해결된 질문
작성
·
48
0
1. 현재 학습 진도
몇 챕터/몇 강을 수강 중이신가요? 6- 12
여기까지 이해하신 내용은 무엇인가요? RedisTemplate으로 SETNX를 할 수 있고, 이 때의 리턴값은 boolean이다.
2. 어려움을 겪는 부분
어떤 개념이 헷갈리시나요?
수업 자료에는 RedisTemplate을 통해 SETNX 요청시 키 존재 유무와 상관없이 모두 True를 리턴한다고 설명

3. 시도해보신 내용
문제 해결을 위해 어떤 시도를 해보셨나요?
혹시 키가 이미 존재하면 RedisTemplate에서는 False 를 리턴하는 것이 아닐까요?
답변 3
0
happyrichman님 제보 해주셔서 감사합니다!!!!
발견하신 내용이 정확합니다!!!! 수업 자료에 오타가 있었습니다!!!!
꼼꼼하게 확인해주셔서 감사드립니다 🙇🙇🙇🙇🙇🙇🙇
1. 올바른 동작 설명
RedisTemplate의 setIfAbsent() 메서드는 Redis의 SET NX 명령어를 사용하며, 키 존재 여부에 따라 다른 값을 반환합니다.
키가 존재하지 않을 때는 새로 키를 저장하고 true를 반환합니다. 이 경우 락을 정상적으로 획득한 것입니다. 키가 이미 존재할 때는 아무 작업도 수행하지 않고 false를 반환합니다. 이 경우 다른 서버가 이미 락을 보유 중이므로 락 획득에 실패한 것입니다.
Spring Data Redis 공식 문서에서도 setIfAbsent 메서드가 "Set key to hold the string value if key is absent"라고 설명하고 있으며, 반환 타입이 Boolean으로 저장 성공 여부를 나타냅니다. https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ValueOperations.html#setIfAbsent(K,V)
Redis 공식 문서의 SET 명령어 NX 옵션 부분을 보시면 "Only set the key if it does not already exist"라고 명시되어 있고, 키가 설정되면 OK, 설정되지 않으면 nil을 반환한다고 되어 있습니다. Spring의 setIfAbsent는 이 OK/nil을 true/false로 변환해서 반환하는 것입니다.
2. 실제 코드에서의 활용
분산 락 구현 시 이 반환값을 기준으로 락 획득 성공/실패를 판단하게 됩니다.
Boolean lockAcquired = redisTemplate.opsForValue()
.setIfAbsent(lockKey, value, timeout, TimeUnit.MILLISECONDS);
if (Boolean.TRUE.equals(lockAcquired)) {
// 락 획득 성공 - 작업 수행
} else {
// 락 획득 실패 - 재시도 또는 실패 처리
}수업 자료 오타 발견해주셔서 너무너무 감사드립니다!!! 덕분에 강의 내용을 더 개선할 수 있었습니다!!! 혹시 추가로 궁금하신 부분 있으시면 편하게 질문 남겨주세요!!!! 🙇🙇🙇
0
happyrichman님 제보 해주셔서 감사합니다!!!!
발견하신 내용이 정확합니다!!!! 수업 자료에 오타가 있었습니다!!!!
꼼꼼하게 확인해주셔서 감사드립니다 🙇🙇🙇🙇🙇🙇🙇
1. 올바른 동작 설명
RedisTemplate의 setIfAbsent() 메서드는 Redis의 SET NX 명령어를 사용하며, 키 존재 여부에 따라 다른 값을 반환합니다.
키가 존재하지 않을 때는 새로 키를 저장하고 true를 반환합니다. 이 경우 락을 정상적으로 획득한 것입니다. 키가 이미 존재할 때는 아무 작업도 수행하지 않고 false를 반환합니다. 이 경우 다른 서버가 이미 락을 보유 중이므로 락 획득에 실패한 것입니다.
Spring Data Redis 공식 문서에서도 setIfAbsent 메서드가 "Set key to hold the string value if key is absent"라고 설명하고 있으며, 반환 타입이 Boolean으로 저장 성공 여부를 나타냅니다. https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ValueOperations.html#setIfAbsent(K,V)
Redis 공식 문서의 SET 명령어 NX 옵션 부분을 보시면 "Only set the key if it does not already exist"라고 명시되어 있고, 키가 설정되면 OK, 설정되지 않으면 nil을 반환한다고 되어 있습니다. Spring의 setIfAbsent는 이 OK/nil을 true/false로 변환해서 반환하는 것입니다.
2. 실제 코드에서의 활용
분산 락 구현 시 이 반환값을 기준으로 락 획득 성공/실패를 판단하게 됩니다.
Boolean lockAcquired = redisTemplate.opsForValue()
.setIfAbsent(lockKey, value, timeout, TimeUnit.MILLISECONDS);
if (Boolean.TRUE.equals(lockAcquired)) {
// 락 획득 성공 - 작업 수행
} else {
// 락 획득 실패 - 재시도 또는 실패 처리
}수업 자료 오타 발견해주셔서 너무너무 감사드립니다!!! 덕분에 강의 내용을 더 개선할 수 있었습니다!!! 혹시 추가로 궁금하신 부분 있으시면 편하게 질문 남겨주세요!!!! 🙇🙇🙇
0
안녕하세요, 인프런 AI 인턴입니다. happyrichman님.
Redis의 SETNX는 “SET if Not eXists”라는 의미로, 특정 키가 존재하지 않을 때만 값을 설정합니다. RedisTemplate을 사용하면 이 연산의 결과를 이용하여 키가 성공적으로 설정되었는지 확인할 수 있습니다.
RedisTemplate과 SETNX
- True가 반환되는 경우: 키가 존재하지 않아 새로운 값을 설정할 수 있었던 경우,
SETNX는 성공적으로 값을 세팅하고true를 반환합니다.
- False가 반환되는 경우: 키가 이미 존재하는 경우, 값은 설정되지 않으며
false를 반환합니다. Redis에서null을 반환할 때, RedisTemplate은 이를false로 변환하여 제공합니다.
수업 자료에서 설명된 내용이 오해의 소지가 있을 수 있습니다. Redis의 SETNX는 키가 존재하지 않는 경우에만 설정이 성공하므로 true를 반환하고, 그렇지 않은 경우에는 설정 실패로 false를 반환합니다.
관련해서 더 많은 정보를 확인하려면 다음 유사한 질문과 답변을 참조해 주세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




