Redis(Remote Dictionary System)
- "key-value" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스기반의 비관계형 데이터베이스 관리 시스템
- in-memory 데이터 저장소(RAM)로서 모든 데이터를 메모리에 올려둡니다. (caching)
- 평균 작업 속도가 1ms로 굉장히 빠른 편이며, 초당 수백만 건의 작업이 가능합니다.(지연시간 감소, 처리량 증가) (caching)
- Scale-up, Scale-out, Replication, Sharding 기능 지원
- Scale-up: 동일 서버 하드웨어에 컴퓨팅 자원(CPU, Memory)을 추가(서버 성능 향상)
- Scale-out: 서버를 여러 대 추가하여 시스템 확장(서버 성능 향상)
- Replication: 동일 데이터를 다수의 레디스 서버에 중복 분산 저장(읽기 성능 향상)
- Sharding: 대규모 데이터베이스를 샤드라는 작은 데이터베이스로 분할(쓰기 성능 향상)
- Single-Thread로 동작
HashMap vs Redis
- 분산 환경에서 Hashmap은 동기화가 어렵지만, Redis는 동기화를 제공해줍니다.
- 애플리케이션이 종료될 때 HashMap에 있는 Data는 사라지지만, Redis는 인 메모리 데이터를 영구 저장할 수 있는 기능(Redis Persistence)을 지원합니다(RDB, AOF)
캐싱 전략 (read strategy)
Look-Aside
- 애플리케이션에서 데이터를 찾을 때 cache에 먼저 확인 (cache hit)
- cache에 데이터가 있으면, cache에서 데이터를 가지고 오는 작업을 반복
- 레디스에서 찾는 key가 없다면, 애플리케이션은 DB에 접근해서 데이터를 직접 가지고 온 뒤, 다시 redis에 저장 (cache miss)
- cache는 찾는 데이터가 없을 때에만 입력(lazy loading)
Cache Warming
- Look-Aside 전략은 트래픽 급증 시, connection이 모두 DB로 붙기 때문에 DB 과부하 우려 발생
- 이에 대한 대안으로써, 사전에 db에서 cache로 데이터를 밀어 넣어주는 작업을 수행
- 티켓링크에서는 상품 오픈 전 상품의 정보를 캐시로 밀어두는 작업 진행
캐싱 전략 (write strategy)
Write-Around
- cache에 데이터를 저장하지 않고 DB에 데이터를 저장하는 방식
- cache miss가 발생한 경우에만 cache의 데이터를 끌어오게 됩니다
- 이 경우, cache 내의 데이터와 DB 내의 데이터가 다를 수 있습니다
Write-Through
- DB에 데이터를 저장할 때 cache에도 함께 저장합니다
- cache에는 항상 최신 정보가 담겨있지만, 저장할 때마다 두 단계 step을 거쳐야 하기 때문에 상대적으로 속도가 느립니다.
- 저장하는 데이터가 재사용되지 않을 수도 있는데 무조건 cache에 넣어버리기 때문에 리소스 낭비의 우려가 있습니다
- 데이터의 보관 시간(expire time)을 설정해 주는 것이 좋습니다
Write-Back
- 데이터를 저장할 때 DB에 바로 저장하지 않고, cache에 모아서 일정 주기 동안 배치 작업을 통해 DB에 반영
- write가 많이 일어나는 경우, 사용하기에 적합합니다.
- 데이터 유실 우려가 있습니다.
Redis Data Type
- Strings: 가장 기본적인 데이터 타입, set 커맨드를 이용해 저장되는 데이터
- Bitmaps: bit 단위 연산 가능
- lists: 데이터를 순차적으로 저장하는 경우, queue로 사용하기에 적합
- Message Queue로 사용하기 적합합니다.
- 자체적으로 Blocking 기능을 제공하기 때문에, 이를 적절히 사용하면 불필요한 Polling을 막을 수 있습니다.
- LPUSHX / RPUSHX : 키가 있을 때만 데이터를 저장
- hashes: 하나의 key 안에 여러 개의 key-value 쌍이 들어 있습니다.
- sets: 중복되지 않은 문자열이 저장
- sorted sets: set처럼 중복되지 않은 값을 저장하지만, score라는 숫자 값으로 정렬합니다.
- hyperloglogs: 굉장히 많은 데이터를 다룰 때 사용하고, 중복되지 않은 값들의 개수를 count 할 때 사용합니다.
- stream: log를 사용하기에 가장 좋은 자료구조입니다.
Redis Persistence
- RDB: 저장 당시의 메모리에 있는 데이터를 사진 찍듯 찍어서 파일로 저장(snapshot) -> 백업은 필요하지만 어느 정도의 데이터 손실이 발생해도 괜찮은 경우에 사용하기 적합
- AOF: 데이터를 변경하는 커맨드가 들어오면 커맨드를 모두 그대로 로그 파일에 기록 -> 서버에 이상이 생기더라도 모든 데이터가 보장되어야 하는 경우에 사용하기 적합
<참고 자료>
https://www.youtube.com/watch?v=92NizoBL4uA
https://meetup.nhncloud.com/posts/224
'Database' 카테고리의 다른 글
[DB] DB 형상관리를 위한 Flyway 적용 (0) | 2025.01.07 |
---|---|
[DB] MySQL Replication, Garela Cluster (0) | 2023.09.21 |
[DB] MariaDB, MySQL 비교 (0) | 2023.09.20 |