상세 컨텐츠

본문 제목

Redis 개념

카테고리 없음

by 개복신 개발자 2022. 11. 5. 16:46

본문

728x90
반응형

컴퓨터 메모리의 종류

보통 레지스터, 캐시, RAM을 주 기억장치라고 부른다. 프로그램이 실제로 구동될 때 이 세 기억장치를 사용하기 때문이다.

  • 레지스터는 제일 빠른 메모리로, CPU 계산과정의 일부로 작동한다.
  • 캐시 메모리는 레지스터 다음으로 빠른 메모리로 L1, L2, L3 캐시 등 여러 단계로 나뉘어진다. 숫자가 작을수록 용량이 작고 빠르며 숫자가 클 수록 용량이 크고 느리다.
  • RAM(중간 창고)은 매우 빠르지만 CPU > Cache > RAM 순서로 빠르다. 하지만 SSD, HDD에 비해서는 월등히 빠르다.

보통 게임을 처음 실행하거나 스테이지를 넘어갈 때 화면에서 “로딩중…(loading…)” 이라는 메시지를 볼 수 있는데, 이 때 로딩이 바로 하드디스크에서 데이터를 읽어 램으로 전송하는 과정을 의미한다.

 

하드 디스크(hard disk): 장기간 데이터 저장, 비휘발성(곳간, 창고)

Cache 개념

Cache Memory는 메인 메모리와 CPU 간의 데이터 속도 향상을 위한 중간 버퍼(cpu와 메인 메모리 사이의 속도 간극

을 줄이는 완충재) 역할을 하는 CPU 내 또는 외에 존재하는 메모리이다.

캐시는 메모리 계층 구조상 최상단 티어에 위치합니다.

메인 메모리보다 작고 가격이 비싸며 속도가 빠릅니다.

Cache: 잠시 저장해둔다는 의미 

실제 메모리와 CPU 사이에서 빠르게 전달 하기 위해 미리 데이터들을 저장해두는 빠른 메모리이다.

캐시 --> CPU 코어 가까이에 위치

대표적인 캐시 메모리 저장 규칙

1. 최근에 접근된 데이터 (시간적 지역성 Temporal Locality)

한 번 참조된 데이터는 잠시 후에 또 참조될 가능성이 높다!

 

2. 최근에 접근된 데이터의 주변 데이터(공간적 지역성 Spatial Locality)

참조된 데이터의 근처 데이터가 사용될 가능성이 높다!

배열안의 값을 참조한 경우 배열 안 주변 데이터를 사용할 가능성이 같이 높아진다

 

3. 저장된 순서대로 인출되어 실행(순차적 지역성 Sequential Locality)

 

캐시 동작 구조

CPU가 Cache 기억 장치에 접근 후 찾으면 적중(hit) 찾지 못하면 실패(miss)라고 한다.

적중시(hit)에는 주기억장치에 방문하지 않고 캐시메모리 정보를 cpu로 전송

실패시(miss)에는 주기억장치에 방문하여 캐시 기억장치에 저장하고 정보를 가져온다.

L1 Cache: 중앙 처리 장치에 가장 근접, 가장 빠른 Cache

-데이터 사용 및 참조에 가장 먼저 사용된다

-보통 8~64kb 정도의 용량 캐시들 중에서 용량이 가장 작다

L2 Cache: 중앙처리장치내 속해 있는 메모리 BUT L1 cache 보다 느리다

-일반적으로 64kb ~ 4mb 정도 사용

L3 Cache: 모든 코어가 공용으로 사용하는 공유 메모리

-속도 느림 but 가장 큰 메모리

 

Redis란??

-고성능의 키-값 데이터 구조 store(Key-Value Store)

 

- In-Meomory Database

데이터 스토리지의 메인 메모리에 설치되어 운영되는 방식

하드 디스크가 아닌 메모리에서 관리하고 분석할 수 있다. 따라서 데이터 처리 시간을 단축하고

빠른 의사결정을 지원한다.

 

-Collection 지원

Memcache랑 다른점이다!

예를 들면 c언어와 python의 관계와 비슷하다.

python은 여러 라이브러리를 제공한다. 기본적인 리스트, 스택 큐 등등 지원해주는 반면

c언어는 모든 것을 구현하여 사용해야 한다.

Redis는 collection을 지원하여 Strings, List, Set, Sorted Set, Hash등을 사용할 수 있다.

따라서 관리가 더 쉽다.

 

-NoSQL Cache 솔루션

 

-Single Thread

하나의 프로세스에서 한가지 작업을 실행하기 위해 순차적으로 실행되는 하나의 흐름

즉 동시에 하나의 코드만 실행할 수 있다.

이 때문에 주의해야 할 점은 시간이 오래 걸리는 명령어를 사용할 경우 뒤에 있는 명령어들은 기다려야

하므로 성능에 영향을 준다.

 

-영구적 보존

명시적으로 삭제 Expire를 설정하지 않으면 데이터는 삭제되지 않는다.

휘발성인 메모리에 데이터를 저장함에도 영구성을 지원하기 위해 RDB와 AOF를 지원한다.

RDB:

 

Redis 장점

-리스트, 배열과 같은 데이터 처리에 유용하다

-메모리를 활용하면서 영속적인 데이터 보존이 가능하다.

디스크에 데이터를 기록하기 때문에 메모리가 날라가도 복구할 수 있다.

-스냅샷 기능을 제공하여 rdb 파일로 저장한다. 따라서 해당 시점으로 복구할 수 있다.

 

Redis 단점

-메모리를 2배로 사용한다.

싱글 스레드이기 때문에 스냅샷을 뜰 때 자식 프로세스를 하나 만들어낸 후 새로 변경된 메모리 페이지를

복사해서 사용한다. Redis 사용시 데이터 변경 횟수가 많기 때문에 실제 메모리 크기만큼 자식 프로세스가

복사한다. 그래서 실제로 필요한 메모리 양보다 더 많은 양을 사용한다.

-대규모 데이터에 대한 응답 속도의 불안정성

대규모 트래픽으로 인해 많은 데이터가 업데이트 되면 속도가 불안정해진다. 

Redis는 jemalloc를 사용하기 때문에 malloc 과 free를 통해 메모리 할당이 이루어진다.

반면 Memcached는 slab 할당자를 이용하여 메모리 재할당을 하지 않고 관리하는 형태를 취한다.

 

Redis는 언제 사용해야 하는가?

좋은 기술이 생기면 바로바로 서비스에 적용하는 것은 좋지 않은 방식이다. 왜 써야 하는지 목적에

집중하여 사용해야 할 경우를 구분해야 한다.

1. 운영중인 웹 서버에서 키-값 형태의 데이터 타입을 처리해야 할 때

2. I/O가 빈번히 발생하는 경우

 

예시)

youtube 조회수

한번에 100만 조회수를 넘기기도 하는 youtube 조회수 서비스는 I/O가 빈번히 발생한다.

이를 RDS에 저장한다면 엄청난 자원이 사용된다. 이러한 데이터를 캐싱 처리하면

부담을 줄일 수 있다. 물론 redis만으로 이 과정을 처리할 수는 없다. 백엔드에서 연산 처리를

해야 하고 RDS간 데이터 업데이트를 주기적으로 해야 한다.

 

예시2)

랭킹 시스템

만약 DB에 유저의 score를 저장하고 score로 order by 정렬 해서 읽어오기 방법을 쓴다면...

유저가 많을 경우에 과부화가 생긴다.

Redis의 Sorted Set을 사용하면 랭킹 구현 가능하다.

유저와 score 정보를 캐시에 저장하고 내부 collection 기능인 sorted set을 사용하면 빠르게..

 

 

Redis vs Memcached

    분류                                       Redis                                                                       Memcached
처리속도 데이터가 디스크와 메모리에 저장되는데 Memcached와 성능 차이가 없음, 빠름 데이터가 메모리에만 저장, 빠름
데이터 저장 방식 데이터가 디스크에도 저장이 되기 때문에 데이터 복구 가능 데이터가 메모리에만 저장되기 때문에 프로세스가 죽거나, 장애 발생시 데이터 사라짐
만료일 지정 방식 만료일을 지정하면 만료된 데이터는 캐시처럼 사라짐 동일
메모리 재사용 메모리를 재사용하지 않음, 명시적으로만 데이터 제거 가능 저장소 메모리를 재사용. 만료전에 더 이상 데이터를 넣을 메모리가 없으면 LRU 알고리즘에 따라 데이터 삭제
데이터 타입 다양한 데이터 타입 지원 문자열만 지원
 

Redis 사용 이유

Memcached는 작은 데이터를 임시저장하는 것에 강점이 있다.

멀티 스레드를 활용하여 다중 처리가 빠르다는 장점이 있다. 하지만 그 외에는 모든 것이 단점이다.

극한의 상황을 제외하고 편의성과 기능성을 보았을 때 Redis가 Memcached보다 유리하다.

반응형

댓글 영역