TIL

Redis 란?

유당불내증이 있는 개발자 2023. 8. 19. 15:32

레디스란 무엇인가

기본적으로 웹 환경에서 같은 시간에 동시다발적인 요청이 들어올 수 있다. 멀티스레드 환경에서는 여러 스레드가 한 자원을 공유하게 되면서 데이터 정합성 문제가 발생하게 된다. 해결방법으로 JPA의 비관적 락, 낙관적 락  Redis를 사용하는 방법으로 해결하고 있다.

Redis는 분산 락(Distributed Lock) 방법을 이용해 동시성 문제를 제어한다. 분산 락은 이름 그대로 분산된 서버 또는 데이터베이스 환경에서도 동시성을 제어할 수 있는 방법이다. 레디스는 인메모리 데이터베이스의 한 종류이다. 그래서 기본적으로 디스크를 사용하는 데이터베이스보다 메모리를 사용하는 Redis가 더 빠르게 락을 획득 및 해제할 수 있기 때문에 사랑받는 기술중에 하나인듯하다.

 

왜 속도가 빠른가?

 메모리 <-> 디스크 간 병목이 없기 때문에 disk-based DB ( mysql,oracle 등) 보다 훨씬 속도가 빠르다.

 

Lettuce 와 Redisson

Redis를 사용하는 방법중에 Lettuce와 Redisson 가 있다. 기본적으로 지원하는 클라이언트는 Lettuce이고  때문에 좀 더 사용하기 편하다는 장점이 있다.

 

우선 Lettuce는 스핀 락 방식이다. 스핀 락은 락을 획득하기 위해 SETNX라는 명령어를 사용하고 계속해서 Redis에 락 획득 요청을 보내게 된다.  따라서 순회하는 동안 계속해서 Redis 에 요청을 보내게 되고 스레드 혹은 프로세스가 많다면 Redis 에 부하가 가게 될 것이다.

 

Redisson은 Pub-sub 기반 방식이다.

동시에 여러 스레드가 접근하였을때 먼저 락을 점유중인 스레드가 작업 완료 후, 락을 해제했음을, 대기중인 스레드에게 알려주면 대기중인 스레드가 락 점유를 시도하는 방식이다. 이 방식은, Lettuce와 다르게 대부분 별도의 Retry 방식을 작성하지 않아도 된다.

락을 획득했을 때의 타임아웃과, 락 대기 타임아웃 기능이 있다는 장점이 있다.

문제점

in-memory 방식은 기본적으로 영속성을 보장하지 않기 때문에. 프로세스가 갑자기 종료되면 데이터가 모두 유실될 수 있다.

 

해결책

백업해두자, 배치프로그램을 이용해서 레디스에 있는 데이터베이스를 긁어와서 저장한다.

 

RDB스냅샷방식 - 스냅샷 이벤트가 발생할때마다 저장

순간적으로 메모리에 있는 내용을 스냅샷을 떠서 DISK에 옮겨 담는 방식이다. 스냅샷을 뜬다는 말은 특정 시점의 메모리에 있는 데이터를 바이너리 파일로 저장하는 뜻이다.

RDB 방식은 메모리의 snapshot을 그대로 저장하기 때문에 서버를 재구동시할 때 snapshot을 다시 읽으면 되므로 속도가 빠른 장점이 있다. 

그러나, snapshot을 추출하는데 시간이 오래걸리고 도중에 서버가 꺼지면 이후의 데이터를 모두 사라진다는 단점이 있다. 

일반적으로 5분 이상마다 RDB 스냅샷을 생성하므로 갑자기 Redis가 작동을 중지하는 경우 최신 데이터 손실이 발생한다.

 

 AOF - 모든 쓰기 명령에 대한 로그를 남기고 그 로그를 토대로 데이터를 재구성한다. RDB방식보다 안정적이다. 

쓰기 명령에 대해 추가하며 기록되기 때문에 파일 사이즈가 커지게되고 서버 시작시 로딩속도가 느리다.

RDB와 AOF 방식을 적절히 혼재해서 사용할 것을 권장

백업은 필요하지만 어느 정도의 데이터 손실이 발생해도 괜찮은 경우, RDB를 단독 사용하는 것을 고려한다.

장애 상황 직전까지 모든 데이터가 보장되어야 경우 AOF사용

 

사건사고

- 2019년 쿠팡에서 레디스 문제가 있었다. 
https://www.digitaltoday.co.kr/news/articleView.html?idxno=212904

 

Redis의 Key값이 너무 많아져서 key가 가질수 있는 최대값인 2147483647(약21억4천7백)을 넘어버렸기때문에 발생한 문제

32bit CPU에서 int 최대값이 2147483647(약21억4천7백)이다.

상품의 재고가0으로 변경되었다.

 

Redis 입문을 위한 강의

- 인프런 강의로 재고시스템에 동시성 문제에 레디스를 사용해볼 수 있는 강의가 있다. 

입문용 강의로 추천한다. 쉽게 적용 가능하다.

https://www.inflearn.com/course/동시성이슈-재고시스템/dashboard

 


추가 공부..

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

https://velog.io/@newdana01/DB-Redis-%ED%8A%B9%EC%A7%95%ED%99%9C%EC%9A%A9%EB%B2%95%EC%BA%90%EC%8B%B1%EC%A0%84%EB%9E%B5

 

[DB] Redis 특징/활용법/캐싱전략

Key-Value 형태로 저장되는 NoSQL로, 인메모리 데이터베이스이다. 디스크가 아닌 컴퓨터의 주 메모리에 데이터를 저장하기 때문에 보다 빠른 데이터 검색이 가능하다. String, Set, Sorted Set, Hash, List 등

velog.io