1️⃣ Redis 란 ?
- Key : Value 구조의 데이터를 저장하기 위한 비관계형 DB ( NoSQL, 쿼리가 아닌 커맨드 기반 )
- Disk가 아닌 Memory에 데이터를 저장한 In - memory 방식 ( memory는 속도가 빠른 대신 휘발성 )
- Single Thread로 동작한다.
⭐위 3가지 키워드가 Redis의 상징적인 특징이기 떄문에 꼭 기억 ⭐
- 저장되는 Key에 TTL(Time To Line)을 설정할 수 있다.
- TTL은 특정 Key에 대한 만료기한! ( 이 시간이 지나면 해당 Key는 Redis에서 지워짐 ) 이걸 이용해 여러가지 요구사항을 구현할 수 있다.
2️⃣ Redis가 지원하는 자료구조
Key : Value 형태로 데이터를 저장하는데, 이때 value에 어떤 자료구조가 올수 있는지 소개 해보려한다.
➡ 각각의 자료구조를 어떤상황 & 요구사항에 적용가능할지
어떤 Value가 오든지 TTL은 Key에만 설정할 수 있다.
✅ String ( 문자열 )

➡ 기본적인 set, get 외 mset, mget, setnx등 의 커맨드도 같이 기억해두기 !
✅ List ( 연결 리스트 )
lpush, lpop, rpush, rpop을 이용해 데이터를 리스트의 양 끝에서 넣고뺄 수있다.
이외에도 길이를 조회하는 len, 리스트를 정해진 길이로 자르는 ltrim 등을 같이 기억하자!
➡ 대기열 구현, 최근 방문글 구현등 다양한 활용기 가능
✅ Set ( 집합 )

집합 답게 데이터의 순서를 보장하지 않고, 데이터의 중복을 허용하지 않는다.
sodd, srem를 통해 set에 데이터를 추가/삭제할 수 있고, 추가적으로 smembers(전체 조회), sismember(포함여부 확인), sinter(교집합), scard(크기)등의 명령어를 지원한다.
✅ Hash ( 해시 ) ⭐



해시는 Map<String, Map<String, ?>> 이런 구조임
Key : Value 안에 다시 Key:Value를 저장할 수 있는 자료구조. ( 단, Hash Key에만 TTL을 설정할 수 있다. )
hset, hget, hgetall, hmget등의 명령어를 제공하고 대부분의 명령어는 O(1)의 시간 복잡도를 가진다!!
➡ 굉장히 빠르고 메모리가 효율적이라 자주 사용한다. ex) 코인의 시세정보를 저장하는 등의 활용이 가능하다!
✅ Sorted ( ZSet )
말 그대로 정렬된 Set이다. 정렬의 기준이 필요하기 때문에 구성요소는 (member, score) 쌍으로 이뤄진다.
⭐ score를 기준으로 정렬이 된다!!

Zadd, Zrem, Zincrby등으로 추가/삭제, Zrange, Zrank, Zrevrange, Zrevrank등의 커맨드로 데이터를 조회한다.
대부분의 커맨드는 O(log N)의 시간복잡도를 가진다.
➡ 순위를 나타내는 리더보드 구현, 많이본 주식 구현 등에서 활용해볼 수 있다.
(KeyWord : 정렬 ! 읽기 비율 > 쓰기 비율 )
3️⃣ 언제 활용할까?
🔥 어떤 기술을 사용한다는 의사결정에는 반드시 근거가 필요하다 !!
✅ Cache 저장소로써의 활용
Remote
In-memory로 빠르게 동작하면서도 다양한 자료구조를 지원한다는 장점이 있다 !
위 장점과 더불어 기술적으로 충분한 성숙을 이뤘다는 점에서 Remote Cache Server로 많이 사용된다
✅ Scale-out 상황에서 중앙 저장소로써의 활용 ⭐
대표적인 중앙 저장소로써의 활용은 Sessoin 저장소가 있다.
주로 쓰이는 상황 ex) Session, Spring Scheduler, WebSocket 등등..


➡ Scale-out 된 환경에서의 기존 Session의 문제를 살펴보자

Reis에 공용으로 쓰자는 점
✅ 데이터 저장 목적 활용
여기서 말하는 "저장" 의미는 영속성을 구현한다는 것 보다는 여러대의 서버 사이에 주고받을 데이터를 저장하는 것에 가깝다.
Redis 자체적으로 영속성을 위한 기능을 제공하긴 하지만 일반적으로 영속성을 목적으로 사용하지 않는편이다.
Redis는 Single Thread로 동작하기 때문에 Race Condition 이슈에서 자유롭고 빠르다!

✅ 데이터 전송 목적으로 활용 ( Event )
Redis는 Kafka와 유사한 Pub/Sub 기능을 제공해준다
이를 이용해 EDA( Event Driven Architecture )를 구현하는 등의 활용이 가능하다.
이벤트 구조: 발행 ➡ 중간 처리 역할 ⬅ 수신
✅ 동시성 문제 해결을 위한 활용
동시성 문제의 케이스는 다양하지만 대표적으로 "선착순 티켓팅" 기능을 떠올리면 좋을것 같다.
이러한 동시성 문제를 Single Thread 기반으로 동작하는 Redis를 이용해 Lock을 구현하면 쉽게 해결할 수 있다.
4️⃣ Redis Clusting ( H/A )
- Redis Node를 1댈 운영되는것은 매우 위험 ➡ SPOF ( Single Point Of Failure )
- Redis 3.0 버전 부터 최대 1000개의 Node까지 확장할 수있는 Redis Cluster 기능을 제공한다.

지금 당장 이런 구조에 대해서 이해하거나 사용 해볼 필요는 없다.
Redis에 대한 Failover를 구성하고 이를 통해 가용성을 높이기 위해 Redis가 제공해주는 기능이 있다!. 정도로 넘어가기
5️⃣ Redis in SpringBoot
✅ Redis를 사용하는 방법 2가지
- Redis Template
- Spring Data Redis
✅ Redis를 사용할 때 Spring Boot가 Client 역할

➡ Redis Client 라이브러리인 Letture 혹은 Redisson을 활용해 Redis Server에 다양한 Command를 요청하게 됨
✅ 어떤식의 협력?

- Service 입장에서 충분히 설정적인가? ( 비슷한 추상화 수준, 적당한 추상화 )
- 변경에 유연한가? ( Redis ➡ ??? 변경시 )
6️⃣ Redis 별거없는데..?
단순히 Redis를 사용하는 것은 생각보다 더 쉽다. ( 예제 코드도 다양하고, 아이디어 자체도 간단 )
기술중심의 사고가 아닌 문제중심의 사고를 할 수 있어야 한다!
- 나는 어떤 문제를 가지고 있고, Redis를 통해 어떻게 이 문제를 해결하고자 하는 걸까?
- 이 문제를 해결하는 근본적인 해결책은 __ 인데, 꼭 Redis만이 해결 방법일까?
- 똑같은 문제를 해결하는 다양한 방법이 있다면, 나는 왜? 그중에서 Redis를 선택했을까?
- 여기서 왜?는 Only 기술적인 장단점 ❌ ➡ 현재 주어진 상황 + 요구사항을 꼭 함께 고려 할것
- MSA, Redis, Kafka, K8S 등 모두 마찬가지임
공부를 할때도 아래 내용을 파고들면 효과적임
- (Redis 공부중) Redis가 이런 문제를 해결해주는구나?
- 이런 문제는 실제 이런기능을 개발할 때 생길 수 있겠는데
- 이 문제를 해결하는 또 다른 선택지는 없을까?
7️⃣ 마지막 정리
- Redis 하면 떠오르는 3가지 특징 ⭐
- 어떤 상황에서 Redis를 사용할 수 있는지 에 대한 맥락이 중요 ( 사용법은 검색하면 다나옴 )
- Redis 사용을 결정했다면, 내 요구사항 + 데이터를 고려해 적절한 자료구조를 선택하자
- 총 2가지를 고려하자
- 왜 Redis를 사용했나?
- 왜 해당 자료구조를 사용했나?
💡 부록[ Redis에도 트랜잭션이 있다? ]
Redis는 Single Thread 기반으로 각각의 커맨드가 실행됨에 있어 Atomic을 보장해준다.
하지만 여러 Redis 커맨드가 연달아 호출되는 상황에서는 어떨까? ➡ 여전히 Race Condition 이슈가 존재
어떻게 해결할까?
- Lock을 이용한 방법 ( Redis Lock, RDB 배타적 Lock )
- Redis의 Transaction을 이용하는 방법 ➡ Multi 커맨드
Redis의 Multi 커맨드 알아보기
➡ Multi 커맨드 실행우 입력되는 커맨드들은 Queue에 쌓이다가 EXEC 커맨드가 실행되면 Atomic 하게 실행됨
- EXEC는 Rollback은 DISCARD 커맨드
Spring Boot에서 Application에서 Redis Transaction 다루기

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글
| TIL 55 [ 커리어 데이 ( 커리어여정, 협업 가이드, 면접 팁, 취업 ) ] (0) | 2025.05.13 |
|---|---|
| TIL 54 [ Redis 공부 + 커리어데이( 이력서, 개발 성장기 ,AI 시대 신입 개발자 ) ] (0) | 2025.05.12 |
| 테스트 코드 (단위 테스트) ( 스탠다드 ) (0) | 2025.05.11 |
| TIL 53 [ JPA 심화 플러스 과제 ( Lv2 ) ] (0) | 2025.05.09 |
| TIL 52 [⚓ Spring Security + 💡 Tip ( H2, Intelij http ) ] (0) | 2025.05.08 |
