[백엔드 로드맵 - Caching] Redis

Sierra·2022년 10월 8일
0

Backend-Roadmap

목록 보기
39/43
post-thumbnail
post-custom-banner

Intro

이번 포스팅의 주제는 Redis다.
Redis의 개념, 왜 Caching과 연결되는 지, 어떻게 활용할 수 있는지에 대해 포스팅 해 보도록 하겠다.

Redis?

REmote Dictionary Server 의 약자.
메모리 키 값 데이터 구조 저장소다. 오픈소스고 다양한 인 메모리 데이터 구조를 지원한다.

풀 네임만 봐도 알겠지만 사실 어떤 역할을 하는 사람일 지는 전공자라면 알 수 있다.
파이썬에서는 딕셔너리 라는 자료구조를 지원한다. 다른 언어도 마찬가지다.

Redis 는 이러한 자료구조 처럼 데이터를 지칭하는 Key에 특정한 데이터 value를 저장하는 형태이다.
또한 Replication을 제공한다. Replication이란 레디스의 데이터를 다른 레디스 노드에 복사하는 작업인데 덕분에 Redis 노드가 다운 된다고 하더라도 데이터를 제공 받을 수 있다.

Redis는 인 메모리에 데이터를 저장한다. 즉 RAM에 데이터가 저장된다는 의미다. 그러므로 속도가 매우 빠르다. 뿐만 아니라 영속성을 가진다. Disk 에 데이터를 저장할 수 있다.

왜 쓰는가?

웹 서버에서 Key-value 데이터를 사용해야 하고 I/O 가 빈번하게 발생하는 상황에는 Redis를 활용하면 좋다.
그게 아니라면 무작정 Redis 가 좋아보인다고 설치 할 필요는 없다. 메모리 파편화의 문제도 생길 수 있기 때문이다. Redis를 사용하는 상황이라면 데이터의 변경이 자주 생긴다는 의미고 Redis는 싱글쓰레드 형태이다. 스냅샷을 생성할 때 자식 프로세스를 생성하여 변경 된 데이터를 복사해서 붙혀넣는 구조고 이러한 구조는 메모리를 2배로 사용하게 된다. 싱글 쓰레드라는 특징 때문에 긴 트랜젝션을 처리하는 동안 그 트랜젝션을 처리하느라 다른 작업을 못하게 될 수 있다. 그러므로 무작정 Redis를 도입했다간 괜히 메모리만 부족 해 지는 상황이 발생한다.

주로 쓰는 예시로는 유튜브의 조회수가 있다. 갑자기 하나의 영상이 엄청난 인기를 끈다면, 조회수 또한 엄청난 변화를 겪게 된다. 이런 상황에서 Redis가 유용하다. 또 다른 예시로는 세션 관리다. 사용자의 세션을 유지하고 불러오는 데 자주 쓰인다.

Redis가 지원하는 자료구조

String, Hash, List, Set, Sorted Set을 지원한다. 이러한 다양한 타입들을 조합해서 상황에 맞게 써먹을 수 있다. 각 자료구조들이 키 값에 할당되어있고 그걸 꺼내와서 쓴다고 생각하면 된다.

지원하는 기능들

Master slave 구조를 활용한 다양한 복제본들을 활용하는 클러스터 구조를 지원한다. 또한 트랜젝션 기능도 지원하고 Pub / Sub Messaging 방식의 메시지에 대한 검색 또한 가능하다. Redis 자체적으로도 Message Broker 역할을 하도록 활용할 수도 있다.

Outro

요약하자면 레디스는 NoSQL로써 Key-Value 값으로 데이터를 저장하고 String, Hash, List, Set, Sorted Set 형태의 자료구조를 지원한다는 것이다. 뿐만 아니라 클러스터링이 가능하고 메시지 브로커 역할도 할 수 있지만 싱글 쓰레드이므로 I/O 성능이 빠르지만 복잡한 트랜잭션에 대한 에러가 발생할 시 문제가 생길 수 있다는 것이다. 단, 자식 프로세스를 생성해서 데이터 변경을 paste 하는 과정이 존재하므로 메모리를 많이 차지한다는 단점이 존재한다는 것이다.

그리 많이 써 본적은 없어서 잘 알지는 못한다. 하지만 자주 쓰게 되었고 앞으로도 쭉 쓸것 같아 정리 해 보았다.

다음 포스팅의 주제는 웹 소켓이다. 로드맵 순서대로 쭉 가려다 당장 웹소켓에 대해 공부를 해야 하기도 하는 상황이 생겨서...

Reference

https://aws.amazon.com/ko/elasticache/what-is-redis/
https://redis.io/docs/

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/
post-custom-banner

0개의 댓글