Database/Redis

[Redis] Redis 기초 개념 정리(1)

Razelo 2022. 11. 11. 20:28

Redis 를 쓸일이 생겼다. 

 

이전에 한번도 써본적이 없었다.

 

실력있는 친구에게 물어보니 요즘 서버에서는 그냥 기본으로 쓴다고 들었다.

 

hiredis 를 통해서 C++ 서버에서 작업하기 전에 기본적인 개념에 대해서는 어느정도 알고 진행해보고자 한다. 


 

Redis = Remote Dictionary Server 

 

In-memory 기반의 key - value 구조 데이터 관리 서버 시스템이다. 

key - value 구조는 비 관계형 구조로써 데이터를 그냥 키-값으로 가지고 있다고 보면 된다. 

 

그래서 이 구조가 관계형 데이터가 아니기에 쿼리 연산이 지원되지 않는다. 다만 데이터의 고속 읽기와 쓰기에 최적화되있다. 그래서 Redis 가 일종의 NoSQL 로 분류되는 것이다. 

 

Redis 는 인 메모리 솔루션으로 DB, Cache, Message Queue, Shared Memory 등의 용도로 쓰인다. 

 

디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 작업 속도가 엄청 빠르다. (리스트형 데이터의 입력과 삭제가 MySQL에 비해서 10배 정도 빠르다고 한다.)

 

또한 여러 언어에 대해 지원되기 때문에 인기가 많다. 

 

메모리에 상주한다는 특성때문에 서비스 상황에 따라 데이터베이스 혹은 Cache로 활용될 수 있다. 또한 여러 서버에서 같은 데이터를 공유하고 보고 싶을때도 쓸 수 있어서 Remote Data Storate 로도 쓸 수 있다. 

 

다양한 자료구조를 지원하며 샤딩이 지원된다고 한다. (샤딩이란 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산해서 저장하는 방법이라고 한다.)

 

메모리 기반이라 하더라도 영속적인 데이터 보존이 가능하다고 한다. 스냅샷 기능도 제공해서 메모리 내용을 *.rdb 파일로 저장할 수 있다고 한다. 이후에 이걸 사용해서 해당 시점으로 복구가능하다고 한다. (오호?)

 

Redis 는 1개의 싱글 스레드로 수행된다고 한다. 그래서 Replication 구조(Master - Slave 구조)를 써야만 안정적인 인프라를 구성할 수 있다고 한다. 

 

우선적으로 왜 캐시 서버를 쓰는지 짚고 넘어가자.

서비스를 처음 운영할때 WEB - WAS - DB 정도로 작게 구성하는데 사용자가 많아지면 DB에 무리가 간다고 한다.

DB는 데이터를 물리 디스크에 직접 쓰기 때문에 데이터가 손실되지는 않는데 이게 매 요청마다 디스크에 접근해야하기 때문에 부하가 많아지면 성능에 문제가 생긴다고 한다. 그래서 이때 가능한 옵션 중에서 DB를 스케일 인 혹은 스케일 아웃하는 방식 외에도 캐시 서버를 쓰고자 하는 선택지가 주어지는 것이다. 

 

캐시를 사용할때도 패턴이 있다고 한다.

 

캐시의 구조 패턴은 아래와 같다. 

 

1. Look aside Cache 패턴  

2. Write Back 패턴 

 

이런 특성을 가진 Redis 는 RDBMS 의 캐시 솔루션으로 사용한다고 한다. (RDBMS의 보완제로써 확실히 자리잡은 솔루션이라는 생각이 든다.) 

 

관계형 데이터베이스(MySQL)에서 1만개의 레코드를 읽는데 이것이 disk에 저장되있으면 30초의 시간이 걸리는데 이걸 RAM 에서 읽는다면 0.0002 초밖에 걸리지 않는다고 한다. 그래서 통상 램과 디스크 사이에서는 천배 가량 속도차이가 있다고 한다. 

(어느정도 속도차이가 있다고는 들었는데 30초 vs 0.0002 초라고 생각하니 속도차이가 체감된다. 그래서 Redis 가 널리 쓰이는게 아닐까 싶다. 너무나 매력적인 솔루션이라는 생각이 든다.) 

 

그래서 Redis 는 DB 의 Read 연산의 부하를 분산시킬 수 있다. 

 

자주 사용하는 데이터는 캐시 서버에서 먼저 조회하고, 없으면 데이터베이스에 가서 다시 조회하면 된다. 

또한 무거운 작업이면 쿼리문이 길기 때문에 이 자체가 서비스 속도의 병목이 되기에 쿼리의 결과 자체를 Redis에 캐싱해두고 쿼리의 결과가 바뀌는 이벤트마다 캐시에 있는 데이터만 새롭게 로드해놓으면 된다는 것이다. 

 

Redis는 메시지 주고받기, 장바구니 삭제에 많이 쓰인다고 한다. 

 

인메모리라는 특성이 상당히 강조되어서 서버를 끄면 사라지는 휘발성의 특성을 가진 RAM 때문에 모든 데이터가 날라간다고 생각할 수 있는데 사실은 Redis는 in-memory이면서도 persistent on-disk 데이터베이스이기에 특정 시점에 in-memory 상태를 disk에 저장해두었다가 Redis를 다시 시작할때 그 disk의 dump파일을 load 하기 때문에 어느정도 손실을 방지할 수 있다고 한다. 

 

Redis는 서버 분산처리 환경에서의 세션 불일치를 해결하는데에도 쓰인다고 한다.

이건 세션 관련 내용이 많은데 아래 블로그를 읽으면 도움이 될 것이다. 

(https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-%EC%84%B8%EC%85%98Session-%EB%B6%88%EC%9D%BC%EC%B9%98-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%EB%B2%95-%E2%B8%A2%EC%84%9C%EB%B2%84-%EB%8B%A4%EC%A4%91%ED%99%94-%ED%99%98%EA%B2%BD-%E2%B8%A5)

 

In-memory 캐시 디비로써 Redis 와 Memcached 중에 어떤걸 써야할까?

write 성능은 Memcached 가 Redis 보다 성능이 좋다. 하지만 read에 있어서는 Redis가 더 나은 성능을 보인다. 

그런데 메모리 효율 자체는 Redis가 더 좋다. 그래서 무난하게 쓰고 싶으면 Redis 가 좀 더 나은 솔루션이라고 한다. 

 

Redis를 쓸때도 조금은 주의해야할 사항들이 존재한다고 한다. (이 점은 숙지하고 있자. 주의사항은 언제나 꿀팁)

 

1. 시간복잡도에 주의하자.

Redis 가 싱글 스레드라고 했다. 그래서 한번에 하나의 명령어만 수행하기 때문에 긴 처리시간이 필요한 명령어를 쓰는 것이 권장되지 않는다. 그 요청을 끝낼때까지 다른 서비스 요청을 받지 못하고 서버가 다운될 수 있다고 한다. 

그래서 O(N) 시간 복잡도를 가진 Keys, flush, getall 등을 주의해서 사용해야 한다고 한다.

 

2. 메모리 파편화

Redis는 기본적으로 메모리를 쓰기 때문에 메모리 파편화 문제가 이슈로 번질 수 있다. 그래서 Redis를 쓸때는 메모리를 여유있게 잡으라고 한다. 

 

[NHN] Redis 야무지게 사용하기 - 아래 링크된 영상 중 언급된 꿀팁 정리 

keys * 를 scan 으로대체한다. 

 

hash 나 sorted set 등은 내부에 여러 자료가 있는데 

하나의 키에 최대 100만개 이상은 저장하지 않도록 적절하게 나누는게 좋다. 

 

delete 대신 unlink를 사용하면 키를 background 로 지워주기 때문에 이게 더 좋다. 

 

STOP-WRITES-ON-BGSAVE-ERROR 는 YES가 디폴트이다. 이 기능을 꺼두는게 장애를 막을 수 있다. 

 

MAXMEMORY-POLICY = ALLKEYS-LRU 는 데이터가 가득 찼을때 이 정책에 의해 데이터가 삭제된다. 

여기서는 ALLKEYS-LRU 가 더 좋다. 

 

Peristence / 복제 사용 시 MaxMemory 는 실제 메모리의 절반으로 설정하는게 좋다. 

예상치 못한 상황에 메모리가 full로 찰 가능성이 있기 때문이다.

 

물리적으로 사용되고 있는 메모리를 모니터링하는게 좋다. 

모니터링 value 중에 used_memory값이 아니라 used_memory_rss 값을 확인하는게 더 좋다. 이건 os가 실제로 redis 에 얼마나 메모리를 할당했는지를 보여주는 값이기 때문이다. 

 


Redis에 대해 어느정도 기초적인 개념을 알아보았는데 꽤나 흥미로운 개념이라고 생각된다.

 

명령어도 살펴봤는데 굉장히 직관적이다.

 

무엇보다 애초에 개념자체가 간단하다보니까 어디에든 잘 붙일 수 있겠다는 생각이 든다. 

 

그래서 흥한건가 싶기도 하다. 


아래 영상 자료도 참고하면 도움이 된다. 

 

Redis의 간략한 개요에 대해 알 수 있다. 

 

https://www.youtube.com/watch?v=Gimv7hroM8A 

https://www.youtube.com/watch?v=92NizoBL4uA 

 

외국 유튜버들이 설명한 영상

https://www.youtube.com/watch?v=8A_iNFRP0F4 

https://www.youtube.com/watch?v=jgpVdJB2sKQ 

 

아래 블로그에서 도움을 받았습니다. 

 

감사합니다. 

https://architecturenotes.co/redis/

 

Redis Explained

A deep technical dive into all things Redis. Covering various Redis topologies, data persistence and process forking.

architecturenotes.co

 

https://ryu-e.tistory.com/9

 

Redis(레디스) 소개 및 기본 개념 정리

Redis(Remote Dictionary System)란 Redis는 메모리 기반의 key - value 저장소입니다. 다른 인메모리 솔루션들과 차이점 중 특별한 점은 다양한 자료구조(문자열, 리스트, 해시, 셋, 정렬된 셋 등)를 지녔다는

ryu-e.tistory.com

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-%EA%B0%9C%EB%85%90-%EC%86%8C%EA%B0%9C-%EC%82%AC%EC%9A%A9%EC%B2%98-%EC%BA%90%EC%8B%9C-%EC%84%B8%EC%85%98-%ED%95%9C%EB%88%88%EC%97%90-%EC%8F%99-%EC%A0%95%EB%A6%AC#thankYou

 

[REDIS] 📚 레디스 소개 & 사용처 (캐시 / 세션) - 한눈에 쏙 정리

Redis (Remote Dictionary Server) Redis는 Remote(원격)에 위치하고 프로세스로 존재하는 In-Memory 기반의 Dictionary(key-value) 구조 데이터 관리 Server 시스템이다. 여기서 key-value 구조 데이터란, mysql 같은 관계형

inpa.tistory.com

https://velog.io/@rmdrkdgh/Redis-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

 

[Redis] 1. 개념 정리

회사에서 Redis, Redis Sentinel를 사용해 보았다. 주로 key에 대한 실시간 데이터 저장의 용도로만 Redis를 사용하였다. 이에 Redis를 왜 사용하는지, Redis에서 제공하는 기능에는 어떤 것들이 있는지, Redi

velog.io

https://redis.com/nosql/key-value-databases/

 

What is a Key-Value Database? | Redis

Learn what a key-value database is, when to use it, and use cases to support modern-application development.

redis.com

 

반응형