TIL

Redis에 대해 알아보기

돌맹이00 2023. 3. 20. 08:00

Redis란?

Remote dictionary server

여기서 dictionary라는 자료구조는 hashmap을 말한다

Spring Boot에서 Redis는 높은 성능의 인메모리 데이터 스토어를 사용하여 애플리케이션에 캐싱, 메시징, 세션 관리 등의 기능을 제공하는 NoSQL 데이터베이스로 사용하게 된다.

 

인 메모리란 하드웨어의 DRAM을 저장 공간으로 사용하는 것을 말한다.

 


Race Condition을 조심해야 한다.

race condition이란 여러개의 Thread가 경합하는 것, Context switching 에 따라 원하지 않는 결과가 발생함


Race Condition은 여러 개의 스레드 또는 프로세스가 공유 데이터에 동시에 접근하려고 할 때 발생하는 동시성 문제. 이러한 상황에서는 스레드 또는 프로세스의 실행 순서에 따라 결과가 달라질 수 있으며, 예상치 못한 결과를 초래할 수 있다. 이것은 컴퓨터 시스템의 신뢰성과 안정성에 악영향을 미치게 된다.

Context Switching은 운영 체제에서 실행 중인 프로세스 또는 스레드의 상태를 변경하여 다른 프로세스 또는 스레드로 전환하는 것을 의미한다. 이를 통해 여러 프로세스 또는 스레드가 시스템 자원을 공유하고 병렬로 실행될 수 있다. 하지만, Context Switching으로 인해 실행 순서가 예측할 수 없게 되면서 Race Condition이 발생할 수 있게된다.

예를 들어, 두 개의 스레드가 동일한 계좌에 입금 및 출금 작업을 수행한다고 가정해 보면,

스레드 A가 계좌의 잔액을 읽습니다 (잔액: 1000 USD).
스레드 B가 계좌의 잔액을 읽습니다 (잔액: 1000 USD).
스레드 A가 200 USD를 입금하고 잔액을 업데이트합니다 (잔액: 1200 USD).
스레드 B가 100 USD를 출금하고 잔액을 업데이트합니다 (잔액: 900 USD).


이 상황에서 스레드 A의 입금 작업이 무시된다. 이러한 Race Condition을 해결하기 위해 동기화 기법을 사용하여 공유 데이터에 대한 접근을 순차적으로 수행할 수 있게된다. 동기화 기법의 예로는 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor) 등이 있더. 동기화를 통해 스레드 또는 프로세스 간의 공유 데이터 접근에 대한 경쟁 조건을 제어하고, 예상치 못한 결과를 방지할 수 있다. 하지만, 동기화를 과도하게 사용하면 성능 저하와 같은 부작용이 발생할 수 있으므로 주의 해야 함.

 

 


그외 주의 해야 할 점


- Single Thread 이므로 시간복잡도를 잘 계산하여야한다.

- In-memory 특성상 메모리파편화, 가상메모리등의 이해가 필요하다

- Single Thread 이므로 key,getAll, flush를 주의해야 한다(사용하지 않음을 권장)

- 가상메모리 및 swap에 대한 개념 이해를 가져야 함.

 

Redis는 메모리 내에서 데이터를 저장하고 처리하는데 최적화되어 있으며, 데이터를 디스크에 저장하는 과정을 최소화하기 때문에 Redis의 성능이 크게 향상된다. 그러나 가상 메모리 시스템이 활성화되어 있다면, Redis가 사용하는 메모리 페이지가 스왑 공간으로 이동할 수 있고, 이로 인해 Redis의 성능이 심각히 저하된다

Redis를 사용하는 시스템에서는 다음을 반드시 지켜야 한다.

- 물리 메모리 크기를 늘려서 스왑이 발생하지 않도록 관리
- 스왑 공간을 사용하지 않거나 최소화하여 메모리 페이지가 스왑되지 않도록 설정. 
- 스왑이 발생하는 구조는 Redis와 같은 인메모리 데이터베이스에서 성능 저하를 초래할 수 있기 때문에, Redis를 사용하는 시스템에서는 스왑이 되지 않도록 구성해야 합니다.