본문 바로가기
개발 이론/Redis

[Redis] Redis 와 Cache, Memcached

by dal_been 2023. 11. 4.
728x90

현대 웹서비스에서는 캐시의 역할이 중요하다. 서비스의 규모가 커져감에 따라 모든 요청을 DB직접 참조 또는 API호출로 처리한다면 성능과 에러 등과 같은 이슈가 발생할 수 밖에 없다.

 

Cache

Cache란

 

캐시란 나중에 요청한 결과를 미리 저장해둔 후 빠르게 서비스를 해주는 것을 의미

즉 미리 결과를 저장하고 나중에 요청이 오면 DB또는 API가 아닌 캐시로 접근하여 요청을 처리

 

캐시가 동작할 수 있는 철학에는 파레토 법칙이 있다

파레토 법칙 → 80퍼센트의 결과는 20퍼센트의 원인으로 인해 발생한다

즉 캐시가 효율적일 수 있는 이유는 모든 것을 캐시하는 것이 아니라 많이 사용되는 20%를 캐싱한다면 전체적으로 영햐을 주어 효율을 극해화할 수 있다

 

 

캐시 사용구조

 

기본적으로 캐시는

클라이언트 요청 → 캐시와 작업 → 실제 DB와 작업 → 다시 캐시와 작업

 

여기서 동일한 flow를 어떻게 사용하냐에 따라 Look aside cache(lazy loading)과 write back으로 나뉜다

 

1. Look aside cache

- 클라이언트에서 데이처 요청

→ 서버에서 캐시에 데이터 존재 유무 확인

→ 데이터가 있다면 캐시의 데이터 사용(빠른 조회)

→ 데이터가 없다면 실제 db 데이터에 접근

→ 그리고 db에서 가져온 데이터를 캐시에 저장하고 클라이언트에 반환

 

더보기

여기서 cache miss와 cache hit 라는 용어가 사용된다

cache miss : 메모리에 찾고자 하는 데이터가 없어 디스크에 조회(DB조회)

cache hit : 메모리에 찾고자 하는 데이터가 있을때

 

2. write back

-웹서버는 모든 데이터를 캐시 서버에 저장
→ 캐시 서버에 특정 시간동안 데이터가 저장됨
→ 캐시 서버에 있는 데이터를 DB에 저장
→ DB에 저장된 캐시 서버의 데이터를 삭제

 

- insert 쿼리를 일일이 한번에 날리지 않고 한거번에 배치처리하기 위해 사용

- 다만 캐시 서버가 죽으면 데이터가 유실된다는 문제점

→ 다시 재생 가능한 데이터나, 극단적으로 heavy한 데이터에서 write back방식을 많이 사용

 

 

캐시 사용 사례

 

1. CPU

  •   자주 사용되는 정보들에 대해 캐시기능 지원

2. Http

  •   동일한 API요청에 대해 반복적으로 요청하지 안도록 클라이언트에서 요청별 키를 관리하여 캐싱

3. CDN resource Caching

  • CDN : 지리적으로 분산된 서버들을 연결한 네트워크
  • 정적 리소스 캐싱을 위해 CDN에 리소스를 배치
  • 리소스는 CDN 지역 전체에 복제되어, 사용자는 가까운 지역의 리소스에 빠르게 접근하여 사용

 

Redis

- key-value 구조 데이터 관리 서버 시스템

  •  key-value 구조란 mysql 같은 관계형 데이터가 아닌 비관계형 구조로서 '키-값'형태로 단순하게 저장
  • 쿼리르 날리지 않고 겨과를 얻을 수 있음
  •   비관계형 구조로 일종의 NOSQL로 분류되기도 함

 

더보기

NOSQL ?

기존 관계형 데이터베이스(RDMS)보다 융통성이 있는 데이터 모델을 사용하고 데이터의 저장 및 검색을 위한 특화된 메커니즘을 제공하는 데이터 저장기술

단순 검색, 추가작업에 있어 매우 최적화된 키-값 저장기법을 사용해 응답 속도나 처리 효율등에 있어 매우 뛰어난 성능을 보여줌

 

 

- 인메모리 솔루션으로 다양한 데이터 구조체를 지원함

  •   →인메모리 : 데이터를 주로 메모리(RAM)에 저장하고 처리하는 데이터 처리 기술
  •   →DB, Cache, Message Queue, Shared Memory 용도로 사용가능

- Collection 자료 구조를 지원함

  • String : 가장 일반적인 key - value 구조의 형태
  • Sets : String의 집합입니다. 여러 개의 값을 하나의 value에 넣을 수 있습니다. 포스트의 태깅 같은 곳에 사용됨
  • Sorted Sets : 중복된 데이터를 담지 않는 Set 구조에 정렬 Sort를 적용한 구조로 랭킹 보드 서버 같은 구현에 사용
  • Lists : Array 형식의 데이터 구조입니다. List를 사용하면 처음과 끝에 데이터를 넣고 빼는 건 빠르지만 중간에 데이터를 삽입하거나 삭제하는 것은 어려움

- 싱글 스레드임 -> thread sage 함 (연산을 하나씩 처리해서)

  • 한번에 하나의 명령어만 처리가능
  • 중간에 처리시간이 긴 명령어가 들어오면 그뒤 명령어는 대기상태  

- 메모리기반이지만 영속적이 데이터 보전이 가능(메모리는 원래 휘발성)

- 스냅샷 기능을 제공해 메모리 내용을 *.rdb 파일로 저장하여 해당 시점으로 복구가능

- 여러 프로세스가 동시에 Key에 대한 갱신을 요청하는 경우, 데이터 부정합 방지 atomic처리 함수를 제공(원자성)

 

 

 


 

Memcached

RDMS에도 mysql,mssql,oracle 등 종류가 있듯이

인메모리db에도 다양한 데이터베이스가 존재한다

 

그중 가장 많이 사용하는 것이 redis와 memcached이다.

두개의 공통점은

- 인메모리 저장소라는 점

- key-value 의 저장방식을 가진다는 점

- 대용량 트랙픽을 고려하여 사용한다는 점

 

Memcached와 redis

 

  Redis Memcached
스레드 싱글 스레드 멀티 스레드
데이터 구조 다양한 자료 구조 지원 string,integers만 지원
데이터 저장 memory,disk memory
처리속도 memcached보다 느리지만 큰 차이 없다 디스크를 거치지 않아 redis보다 빠름
Replication 지원 지원 x
Partitioning method 지원 지원 x
영속성 영속성 있는 데이터 사용 지원안함

 

- Replication

→ 주서버와 하나이상의 복제 서버간의 데이터 복제를 의미

→ 주 서버는 쓰기 작업을 처리하고, 복제 서버는 주  서버의 데이터를 복제하여 읽기 요청에 응답

→ 데이터 손실을 방지하고 가용성을 제공

 

- Partitioning 

→ 데이터 베이스의 데이터를 여러 서버 노드로 분산하는데 사용

→ 대규모 데이터 집합을 여러 서버로 분할하여 각 서버에서 데이터를 독립적으로 관리하고 처리