👉 mysql같은 관계형 데이터베이스가 아닌 비 관계형 구조로서 데이터를 그저 '키-값' 형태로 단순하게 저장하기 때문에 일종의 NoSQL로 분류되기도 한다.
Redis는 단순한 Key-Value 저장소가 아니다.
다양한 데이터 타입(Data Type)을 제공한다.
| 데이터 타입 | 설명 | 예시 |
|---|---|---|
| String | 기본적인 문자열 값 | user:name = "Jieun" |
| List | 순서가 있는 문자열 리스트 | comments = [“hi”, “hello”] |
| Set | 중복 없는 집합 | tags = {“dev”, “ai”} |
| Hash | 필드-값 쌍의 구조체 | user:1 = {name:"Jieun", age:27} |
| Sorted Set | 점수(score)로 정렬된 집합 | ranking = {user1:100, user2:80} |
👉 다양한 구조 덕분에 랭킹, 세션, 좋아요, 큐(Queue) 등 여러 기능을 쉽게 구현할 수 있다.
Redis는 RDB와 AOF 두 가지 방식으로 데이터를 디스트에 저장할 수 있다.
RDB(Redis Database Backup)
AOF(Append Only File)
👉 일반적으로 RDB + AOF를 함께 사용해, 속도 + 안정성을 모두 확보한다.
SET session:user1 "logged_id" EX 3600
→ 1시간(3600초) 후 자동 삭제됨
DB에서 자주 읽는 데이터를 Redis에 저장해, DB 부하를 줄이고 응답 속도를 높인다.
SET user:1:name "User1"
GET user:1:name
💡 Twitter의 Redis 캐시 활용
Twitter는 140자 정도의 짧은 글을 올릴 수 있는 소셜 네트워킹 서비스(SNS)로
사용자가 팔로우한 계정의 최신 트윗을 보여주는 Timeline 기능을 가지고 있다.2012년 당시 Twitter는 15만명이 넘는 실시간 활동 사용자와 초당 30만 건이 넘는 Timeline 요청이 발생하면서 데이터베이스 직접 접근 방식으로는 속도 저하 문제가 발생했다.
Timeline에 표시할 트윗 정보(Tweet ID, 작성자 ID)를 약 800개 정도 List 형태로 Redis에 캐싱하고, 요청이 들어오면 DB 대신 Redis에서 먼저 데이터를 조회해 Query를 단순화했다.
이 방식으로 DB 부하를 크게 줄이면서도 빠른 Timeline 조회 속도를 유지할 수 있었다.
단, 모든 사용자의 Timeline을 캐싱하면 메모리가 부족해지므로 30일 이상 미접속한 사용자의 Timeline 데이터는 Redis에서 자동 삭제되며, 재로그인 시 DB를 통해 다시 생성된다.
로그인한 사용자의 세션 정보를 Redis에 저장하면,
가 간단해진다.
Sorted Set을 이용하면 실시간 랭킹 시스템을 쉽게 만들 수 있다.
ZINCRBY ranking 1 "user1"
ZRANGE ranking 0 -1 WITHSCORES
Redis는 Publish/Subscribe 기능을 지원한다.
여러 서비스 간 실시간 메시지 송수신이 가능하다.
PUBLISH channel1 "Hello World"
SUBSCRIBE channel1
메모리 기반
RAM 용량을 초과하면 LRU 정책으로 오래된 데이터가 삭제된다.
데이터 영속화 필요
RDB/AOF 설정 없으면 서버 재시작 시 데이터 사라진다.
싱글 스레드 구조
CPU를 병렬로 활용하기 어렵지만, 대신 확실히 빠르다.
메모리 파편화
메모리 할당/해제 과정에서 빈 공간(fragment)이 누적되면 실제 물리 메모리 사용량이 커질 수 있다.
또한, RDB 스냅샷/AOF 재작성 시 Copy-On-Write로 순간적으로 최대 2배 이상 메모리를 사용할 수 있으므로 여유 메모리를 확보해야한다.
https://cobinding.tistory.com/234
https://inpa.tistory.com/entry/REDIS-📚-개념-소개-사용처-캐시-세션-한눈에-쏙-정리