Redis와 캐시의 이해

출처 : https://zdnet.co.kr/view/?no=20190724092725

 
한 때 쿠팡에서 위와 같은 에러로 전체 물품이 품절 처리 된 적이 있다. 원인 파악 결과 Redis DB 때문이라는 것이 드러났다.

 

Redis

  • Remote Dictionary Server
  • DB, Cache, Message Broker
  • In-memory Data Structure Store (메모리 상에 데이터를 저장하는 서버)
  • Supports rich Data Structure (다양한 자료구조 지원) 

 

Redis와 캐시의 이해

Redis 는 Remote Dictionary Server라는 뜻. <원격 / Kay-Value /서버>

말 그대로 외부에 있는 Dictionary자료구조를 쓰는 형태의 서버 라는 의미이다.

 

Redis는 기본적으로 In-memory Data Structure Store로서, 데이터를 메모리에 저장하여 빠른 접근을 가능하게 하는 시스템이다. 또한, Redis는 데이터베이스(DB), 캐시(Cache), 메시지 브로커(Message Broker)로서도 사용되며, 다양한 자료구조를 지원하는 것이 특징이다.

 

Redis의 구조와 동작 원리

Redis는 데이터베이스처럼 영구 저장을 보장하면서도, 메모리 기반으로 운영되어 일반적인 디스크 기반 DB보다 훨씬 빠른 성능을 제공한다. 일반적으로 데이터베이스는 SSD와 같은 영구 저장 장치에 데이터를 보관하지만, Redis는 메모리(RAM)에 데이터를 저장하여 더 자주 접근하고 덜 자주 변경되는 데이터를 빠르게 처리할 수 있다. 이러한 구조는 Redis가 캐시로서 효과적으로 사용되는 이유이기도 하다.

 

32비트 CPU에서의 Key 값 문제

그렇다면 32bit CPU 에서 Int 의 최댓값은 얼마일까? 
2147483647 (21억 4천7백48만 3647) 이다.

Redis의 Key-Value 쌍에서 Key 값이 너무 많아져 이 최댓값을 초과하면 시스템에서 문제가 발생할 수 있다. 이는 Redis와 같은 시스템에서 Key 값을 관리하는 데 있어 주의해야 할 사항 중 하나이다.

 

결국 위 쿠팡에서의 사태는 Key value 쌍에서 Key 값이 너무 많아져서 (int값의 최댓값을 넘어가서) 생긴 문제였던 것이다. 

 

 

Redis와 자바 자료구조의 차이

자바의 HashMap과 같은 자료구조도 메모리 기반으로 작동하지만,

private final Map<String, Object> 나는 왜 안쓰는데ㅠㅠ = new HashMap<>();

여러 서버가 동일한 데이터를 공유해야 할 경우, 자바의 HashMap을 사용하는 것에는 한계가 있다. 다음과 같은 문제들이 발생할 수 있다:

  • 서버가 여러 대인 경우 Consistency 문제: 여러 대의 서버가 각각 다른 데이터를 가지고 있기 때문에, 동일한 데이터에 대한 일관성을 유지하기 어려울 수 있다. 예를 들어, 세션 정보를 자바 객체로 저장하면, 다른 서버에서 해당 세션이 존재하지 않기 때문에 문제가 발생할 수 있다.
  • 멀티스레드 환경에서의 Race Condition: 멀티스레드 환경에서는 여러 스레드가 경쟁하며 데이터에 접근할 때 경합 상태(Race Condition)가 발생할 수 있다. 이로 인해 의도하지 않은 결과가 나올 수 있다.
    • Race Condition : 여러 스레드가 경합하며 Context Switching 에 따라 원하지 않는 결과가 발생

 
Redis의 Race Condition 해결

Redis 는 기본적으로 Single Threaded 로 동작한다. 이 덕분에 Race Condition 문제를 해결하는데 유리하다. Redis 자료구조는 Atomic Critical Section(동시에 Process 여러개가 접근하면 안 되는 영역) 에 대한 동기화를 제공하여 여러 프로세스가 동시에 접근할 때도 데이터의 일관성을 유지할 수 있다. 여러 Transaction 들이 Read/Write를 동기화를 하며 원치 않는 결과를 방지한다.

 

 

 
Redis , 어디서 쓰나요? 

Redis는 여러 서버가 동일한 데이터를 공유해야 할 때 특히 유용하다. 예를 들어, 웹 애플리케이션에서 사용자 세션 정보를 저장할 때, Redis를 사용하여 여러 서버 간의 일관성을 유지할 수 있다. 또한, Redis는 캐시로 사용되어, 데이터베이스에 자주 접근하지 않고도 빠르게 데이터를 조회할 수 있는 구조를 제공한다.

  • 여러 서버에서 같은 데이터를 공유: 서버 간에 데이터를 공유해야 하는 경우 Redis가 유용하다.
  • Single Server라면? : Atomic 자료구조 & Cache 기능을 활용하여 효율적인 데이터 관리를 할 수 있다. 

 

Redis 사용 시 주의사항

  • Single Thread 서버이므로 시간 복잡도를 고려해야 한다. 
  • In-memory 특성상 메모리 파편화, 가상 메모리 등의 이해가 필요하다.

 

Redis는 고성능의 메모리 기반 데이터 관리 솔루션으로, 다양한 환경에서 활용될 수 있다. 그러나, 적절한 사용과 주의가 필요하며, 시스템의 요구에 맞는 최적의 설정이 중요하다.

 

 

요약

  • Redis는 Remote Dictionary Server의 약자로, 메모리에 데이터를 저장하여 빠르게 처리하는 In-memory Data Structure Store
  • 데이터베이스보다 더 빠른 Memory 에 더 자주 접근하고, 덜 자주 바뀌는 데이터를 저장하자는 것이 Inmemory DB (Cache) 이다.
  • 주로 DB, 캐시, 메시지 브로커로 사용되며, 다양한 자료구조를 지원
  • Redis는 Single Threaded로 동작하여 Race Condition 문제를 해결하며 여러 서버에서 데이터를 공유하거나 캐시로 활용될 때 유용하다.