Database

[DB] Redis란 무엇인가?

SeungbeomKim 2023. 9. 8. 10:11

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

 

개발자를 위한 레디스 튜토리얼 01 : NHN Cloud Meetup

레디스는 오픈소스이고, 다양한 서비스에서 레디스를 자유롭게 사용하고 있습니다. 위의 사진에서 볼 수 있듯이 Airbnb, Uber, Instagram도 레디스를 사용하고 있네요. 핑크다이어리, 토스트파일, 두

meetup.nhncloud.com

 

'Database' 카테고리의 다른 글

[DB] DB 형상관리를 위한 Flyway 적용  (0) 2025.01.07
[DB] MySQL Replication, Garela Cluster  (0) 2023.09.21
[DB] MariaDB, MySQL 비교  (0) 2023.09.20