들어가기 전

Redis는 Cache와 연관이 되어 있어 Cache에 대해 먼저 알아보고 Redis의 개념과 특징에 대해 알아보겠습니다.

 

Cache란?

자주 사용하는 데이터를  메모리에 미리 복사해 놓는 임시 장소입니다. 캐시는  저장공간이 작고 비용이 비쌉니다. 하지만  사용하는 이유는 빠른 성능을 제공하기 때문입니다.

 

보통 데이터를 사용할 때 디스크에 접근을 해서 저장된 데이터를 사용을 합니다. 지속적으로 데이터를 요청을 하면 DBMS의 부하가 늘어나고 시간도 오래 걸립니다.

 

 

DBMS의 부하를 줄이고 시간을 줄이기 위해 캐시를 사용합니다. 캐시는 메모리에 데이터를 저장하고 관리하기 때문에 DBMS에 접근하는 거에 비해 성능이 뛰어납니다.

클라이언트가 원하는 데이터를 요청을 했을대 캐시에 원하는 값이 있으면 Cache Hit이라고 하고 캐시에 있는 데이터를 사용하고  없으면 Cache Miss라고 합니다. Cache Miss일 경우 DB에서 조회를 하고 지속적으로 Cache Miss가 발생하는 데이터는 변경해야 합니다.

 

캐시 전략

1. Look Aside

  • 클라이언트가 서버에 데이터를 요청하면 서버는 먼저 캐시를 확인합니다.
  • 캐시에 클라이언트가 원하는 데이터가 있으면 Cache Hit이고 캐시에서 조회해 온 데이터를 클라이언트에게 응답을 해줍니다.
  • 캐시에 원하는 데이터가 없으면 Cache Miss이고 DB에서 데이터를 조회해 오고 조회해 온 값을 캐시에 저장하고 클라이언트에게 응답합니다.

Cache Hit일 경우

 

 

Cache Miss일 경우

 

 

 

2. Write Back

  • 서버는 모든 데이터를 Cache에 저장을 합니니다.
  • 특정시간 동안만 캐시에 데이터가 저장되고 캐시 서버에 있는 데이터가 DB에 저장이 됩니다.
  • DB에 저장이 되면 캐시에 있던 데이터를 삭제합니다.

 

 

 

 

Redis란?

Key-Valu 형식으로 저장되는 인 메모리 DB입니다. 모든 데이터를 캐시에 저장하고 관리하여 사용하는 DBMS입니다. 관계형 데이터베이스와 달리 비정형적인 데이터를 다룹니다.

 

 

Redis 특징

1. 영속화 기능 제공

  • 메모리에 데이터를 저장하면 데이터가 휘발성이라 데이터가 사라질 수 있습니다. 그런데 redis에서는 영속화할 수 있는 기능을 제공합니다.
  • 영속화 방법 : 스냅숏, AOF(Append Only File)
    • 스냅샷 : 정기적으로 메모리에서 관리되고 있는 데이터들을 디스크에 저장합니다. 그래서 redis를 재시작하면 스냅샷한 파일을 불러와 데이터를 복원시킵니다. 문제점은 스냅샷을 하는 시점에 모든 명령어가 제한이 걸립니다. 이거에 대한 해결방법으로는 백그라운드에서 실행되게 하는 설정인 BGSAVE를 설정을 합니다. 
    • AOF(Append Only File) : 스냅샷은 데이터가 유실될 수 있습니다. AOF는 명령이 실행될 때마다 해당 명령들을 파일로 기록하여 데이터 유실되는 것을 방지할 수 있습니다.

2. 싱글 스레드 

  • Redis는 싱글 스레드에서 race condition을 피해서 데이터 정합성이 보장이 됩니다.

※ race condition : Race는 두 개의 이상의 스레드가 공통자원을 사용하기 위해 경쟁하여 결과값에 영향을 줄 수 있는 상태입니다.

 

 

3. 부하 분산

Master-Slave로 구성되어 있고 분산환경을 만들어서 Master는 Read-Write 모드로 동작을 하고 Slave는 Read-Only 모드로 동작을 합니다. 그래서 클라이언트는 필요에 따라 Master에 붙어 Write동작을 수행하거나 Master 혹은 Slave에 붙어 Read 동작을 수행하여 부하를 분산시킬 수 있습니다.

 

4. 빠른 성능 제공 및 Key-Value 형식으로 데이터를 저장하고 관리

Redis는 메모리에 데이터를 저장하고 관리하기 때문에 디스크에 접근하는 방식보다 빠른 성능을 제공합니다. 그리고 Key-Value형식으로 데이터를 다루고 데이터 형태로는 String, Set, Sorted Set, List, Hash 등이 있습니다.