Redis: 두 판 사이의 차이

기술노트
(CS 용어 정리 - Redis 추가)
 
(CS 용어 정리 - Redis 추가)
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
1번째 줄: 1번째 줄:
=== Redis ===
== Redis ==


> 빠른 오픈 소스 인 메모리 키 값 데이터 구조 스토어
Redis는 빠른 오픈 소스 인 메모리 키-값 데이터 구조 스토어입니다. 일반적인 데이터베이스는 하드 디스크나 SSD에 데이터를 저장하지만, Redis는 메모리(RAM)에 저장하기 때문에 디스크 스캐닝이 필요 없어 매우 빠른 성능을 제공합니다.


보통 데이터베이스는 하드 디스크나 SSD에 저장한다. 하지만 Redis는 메모리(RAM)에 저장해서 디스크 스캐닝이 필요없어 매우 빠른 장점이 존재함
Redis는 캐싱 기능도 갖추고 있어 실시간 채팅에 적합하며, 세션 공유를 위한 세션 클러스터링에도 활용됩니다.


캐싱도 가능해 실시간 채팅에 적합하며 세션 공유를 위해 세션 클러스터링에도 활용된다.
=== Redis의 데이터 영속성 ===
RAM은 휘발성 메모리이기 때문에 시스템 종료 시 데이터가 손실될 수 있습니다. Redis는 이를 방지하기 위한 백업 방법을 제공합니다:


* '''스냅샷(Snapshot)''': 특정 시점의 데이터를 디스크에 백업하는 방식입니다.
* '''AOF(Append Only File)''': 실행된 명령(쿼리)들을 저장해두고, 서버가 종료되면 이 명령들을 다시 실행하여 데이터를 복구하는 방식입니다.


'''''RAM은 휘발성 아닌가요? 껐다키면 다 날아가는데..'''''
=== Redis의 데이터 구조 ===
Redis는 key/value 값으로 이루어진 비정형 데이터를 저장하는 비관계형 데이터베이스 관리 시스템입니다. Redis는 다양한 데이터 타입의 value를 지원합니다:


이를 막기위한 백업 과정이 존재한다.
1. '''String''': 텍스트나 바이너리 데이터로, 최대 512MB까지 저장 가능합니다.
2. '''Set''': 문자열의 집합입니다.
3. '''Sorted Set''': 정렬된 Set입니다.
4. '''Hash''': 필드-값 쌍의 컬렉션입니다.
5. '''List''': 양방향 연결 리스트가 가능합니다.


* snapshot : 특정 지점을 설정하고 디스크에 백업
=== 인메모리 데이터베이스의 필요성 ===
* AOF(Append Only File) : 명령(쿼리)들을 저장해두고, 서버가 셧다운되면 재실행해서 다시 만들어 놓는 것
인메모리 데이터베이스는 주로 속도 측면에서의 성능 향상을 위해 사용됩니다. 메모리(RAM)에 데이터를 저장하여 엑세스하는 방식은 SSD나 HDD와 같은 디스크 스토리지에서 데이터를 가져오는 것보다 수백 배(HDD 기준) 이상 빠릅니다.


데이터 구조는 key/value 값으로 이루어져 있다. (따라서 Redis는 비정형 데이터를 저장하는 비관계형 데이터베이스 관리 시스템이다)
다만, RAM은 용량이 제한적이라는 단점이 있어 메인 데이터베이스로 사용하기에는 한계가 있습니다. 또한 용량이 큰 RAM을 구매하는 것은 비용 측면에서 큰 부담이 될 수 있습니다.


##### value 5가지
=== Redis의 적합한 사용 사례 ===
Redis는 다음과 같은 경우에 사용하기 적합합니다:


1. String (text, binary data) - 512MB까지 저장이 가능함
* 대용량 데이터 중 소규모의 데이터만을 추출해야 할 때
2. set (String 집합)
* 값의 변경이 빈번하지 않고 데이터 크기가 작을
3. sorted set (set을 정렬해둔 상태)
* 예시: 백만 명의 사용자가 있는 게임에서 상위 100위 랭커를 보여주는 기능
4. Hash
5. List (양방향 연결리스트도 가능)
 
==== 인메모리 DB의 필요성 ====
 
인메모리 DB는 대부분 속도측면에서의 성능개선을 위해 사용된다. 인메모리 DB는 메모리 RAM에 데이터를 올려서 사용하는 방식이다.
왜 메모리에 데이터를 올릴까? 당연히 '''속도''' 때문이다. SSD,HDD 같은 저장공간에서 데이터를 가져오는 것보다 RAM에 올려진 데이터를 가져오는데 걸리는 속도가 수백배(HDD 기준) 이상 빠르다
 
![Ram](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBcwuU%2FbtqWKYSRi5Q%2FjRblmXQlGtIdD4nURFkHWk%2Fimg.png)
 
대신 용량이 작다는 '''단점'''이 존재한다. 그렇기 때문에 메인 데이터베이스로 사용하기엔 무리가 있다.
어? 그럼 RAM의 용량이 큰걸 사서 메인 데이터베이스로 쓰면안되나? '''안된다.'''
비용이 상당히 큰 걸림돌이 되기 때문이다.
 
![HDD](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJNBig%2FbtqWzsOg5he%2FX3tHPGyI7obqDSlc9LDokk%2Fimg.png)
 
==== Redis 사용적합 예시 ====
 
대용량의 데이터 중 소규모의 데이터만을 추출하고자 할때, 또는 값의 변경이 잘일어나지 않고 소규모의 데이터일 사용에 적합하다.
 
예를 들어 사용자가 백만명인 게임의 상위랭커 100위를 보여주는 기능에 적합하다.


=== 캐시 ===
=== 캐시 ===
캐시란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 저장소를 말합니다. 캐시에 존재하는 데이터는 최소한의 비용으로 반복적 접근이 가능하다는 장점이 있습니다.


캐시란 자주사용하는 데이터나 값을 미리 복사해 놓는 임시 저장소를 말한다. 그렇기 때문에 캐시에 존재하는 데이터에 한해서는 최소한의 비용으로 반복적 접근을 할 수 있다.
==== Local Cache vs Global Cache ====
 
캐시는 크게 두 가지 종류로 나뉩니다:
이런 캐시는 두가지 종류로 나뉜다.
 
==== Local Cache VS Global Cache ====
 
* Local Cache
  - Local 환경에서만 작동
  - Local 장비의 Resource를 활용한다. (Memory,Disk)
  - Local에서만 작동 되기 때문에 속도가 빠르다.
  - 타 서버와 데이터 공유가 힘들다.
 
* Global Cache
  - 데이터의 분산저장이 가능
  - 여러 서버에서 접근이 가능
  - Local Cache에 비해 느리다.
  - 별도의 Cache Server를 이용하기 때문에 서버 간 데이터 공유가 쉽다.


Redis는 Global Cache에 적합한다.
* '''Local Cache'''
** Local 환경에서만 작동합니다.
** Local 장비의 리소스(메모리, 디스크)를 활용합니다.
** Local에서만 작동하기 때문에 속도가 빠릅니다.
** 다른 서버와 데이터 공유가 어렵습니다.


* '''Global Cache'''
** 데이터의 분산 저장이 가능합니다.
** 여러 서버에서 접근할 수 있습니다.
** Local Cache에 비해 속도가 느립니다.
** 별도의 캐시 서버를 이용하기 때문에 서버 간 데이터 공유가 쉽습니다.


==== Redis의 동시성 이슈 ====
Redis는 Global Cache에 적합합니다.


Redis는 싱글 스레드 기반으로 데이터를 처리한다. 그런데 동시성 이슈라는 어찌보면 황당한 말이다. 하지만 우리가 분명 Redis를 사용함에 있어
=== Redis의 동시성 이슈 ===
여러명들의 클라이언트들에게 동시에 응답을 해주는 것 또한 알고 있다.
Redis는 싱글 스레드 기반으로 데이터를 처리합니다. 그러나 여러 클라이언트에게 동시에 응답할 수 있는 것은 실제 명령에 대한 작업이 커널 레벨에서 멀티플렉싱(Multiplexing)을 이용해 동시성을 보장하기 때문입니다.


이는 Redis의 동작원리가 실제 명령에 대한 작업은 커널 레벨에서 멀티 플렉싱(Multiplexing)을 이용해 동시성을 보장하기 때문이다.
, 유저 레벨에서는 싱글 스레드로 작동하지만, 커널 I/O 레벨에서는 스레드 풀을 이용합니다. 이러한 동시성 특성 때문에 동시성 관련 에러가 발생할 수 있으므로 적절한 동시성 처리가 필요합니다.
유저레벨에서는 싱글 스레드로 작동하나, 커널 I/O레벨에서는 스레드 풀을 이용한다.


동시성이 존재한다는 것은 언제든 동시성으로 인한 에러가 발생할 수 있다는 것이고 그렇기에 동시성에 대한 처리가 필요하다.
=== Redis의 트랜잭션 처리 ===
Spring Data Redis를 기준으로 트랜잭션을 처리하는 방법은 두 가지가 있습니다:


==== Redis의 동시성 처리를 위한 Transaction ====
1. '''SessionCallback 인터페이스 사용''': 여러 명령을 하나로 묶어서 처리하는 방법으로, 인터페이스를 통해 직접 Redis 명령어를 사용하여 트랜잭션 경계를 설정합니다.
2. '''@Transactional 어노테이션 사용''': 더 간편하게 트랜잭션을 처리할 수 있는 방법입니다.


Spring Data Redis를 기준으로 Transaction 사용 방법이 두가지가 존재한다.
=== 관련 항목 ===
한 가지는 `SessionCallback 인터페이스`를 통해 여러 명령을 하나로 묶어서 처리하는 방법인데,
* [[데이터베이스]]
이 방법은 인터페이스를 통해 직접적으로 Redis 명령어를 사용하여 트랜잭션 경계를 설정하는 방법이고,
* [[NoSQL]]
다른 한 가지는 간편하게 `@Transactional` 어노테이션을 사용하는 방법이다.
* [[캐시]]
* [[인메모리 데이터베이스]]
* [[키-값 저장소]]
* [[분산 시스템]]

2025년 4월 17일 (목) 15:02 기준 최신판

Redis

Redis는 빠른 오픈 소스 인 메모리 키-값 데이터 구조 스토어입니다. 일반적인 데이터베이스는 하드 디스크나 SSD에 데이터를 저장하지만, Redis는 메모리(RAM)에 저장하기 때문에 디스크 스캐닝이 필요 없어 매우 빠른 성능을 제공합니다.

Redis는 캐싱 기능도 갖추고 있어 실시간 채팅에 적합하며, 세션 공유를 위한 세션 클러스터링에도 활용됩니다.

Redis의 데이터 영속성

RAM은 휘발성 메모리이기 때문에 시스템 종료 시 데이터가 손실될 수 있습니다. Redis는 이를 방지하기 위한 백업 방법을 제공합니다:

  • 스냅샷(Snapshot): 특정 시점의 데이터를 디스크에 백업하는 방식입니다.
  • AOF(Append Only File): 실행된 명령(쿼리)들을 저장해두고, 서버가 종료되면 이 명령들을 다시 실행하여 데이터를 복구하는 방식입니다.

Redis의 데이터 구조

Redis는 key/value 값으로 이루어진 비정형 데이터를 저장하는 비관계형 데이터베이스 관리 시스템입니다. Redis는 다양한 데이터 타입의 value를 지원합니다:

1. String: 텍스트나 바이너리 데이터로, 최대 512MB까지 저장 가능합니다. 2. Set: 문자열의 집합입니다. 3. Sorted Set: 정렬된 Set입니다. 4. Hash: 필드-값 쌍의 컬렉션입니다. 5. List: 양방향 연결 리스트가 가능합니다.

인메모리 데이터베이스의 필요성

인메모리 데이터베이스는 주로 속도 측면에서의 성능 향상을 위해 사용됩니다. 메모리(RAM)에 데이터를 저장하여 엑세스하는 방식은 SSD나 HDD와 같은 디스크 스토리지에서 데이터를 가져오는 것보다 수백 배(HDD 기준) 이상 빠릅니다.

다만, RAM은 용량이 제한적이라는 단점이 있어 메인 데이터베이스로 사용하기에는 한계가 있습니다. 또한 용량이 큰 RAM을 구매하는 것은 비용 측면에서 큰 부담이 될 수 있습니다.

Redis의 적합한 사용 사례

Redis는 다음과 같은 경우에 사용하기 적합합니다:

  • 대용량 데이터 중 소규모의 데이터만을 추출해야 할 때
  • 값의 변경이 빈번하지 않고 데이터 크기가 작을 때
  • 예시: 백만 명의 사용자가 있는 게임에서 상위 100위 랭커를 보여주는 기능

캐시

캐시란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 저장소를 말합니다. 캐시에 존재하는 데이터는 최소한의 비용으로 반복적 접근이 가능하다는 장점이 있습니다.

Local Cache vs Global Cache

캐시는 크게 두 가지 종류로 나뉩니다:

  • Local Cache
    • Local 환경에서만 작동합니다.
    • Local 장비의 리소스(메모리, 디스크)를 활용합니다.
    • Local에서만 작동하기 때문에 속도가 빠릅니다.
    • 다른 서버와 데이터 공유가 어렵습니다.
  • Global Cache
    • 데이터의 분산 저장이 가능합니다.
    • 여러 서버에서 접근할 수 있습니다.
    • Local Cache에 비해 속도가 느립니다.
    • 별도의 캐시 서버를 이용하기 때문에 서버 간 데이터 공유가 쉽습니다.

Redis는 Global Cache에 적합합니다.

Redis의 동시성 이슈

Redis는 싱글 스레드 기반으로 데이터를 처리합니다. 그러나 여러 클라이언트에게 동시에 응답할 수 있는 것은 실제 명령에 대한 작업이 커널 레벨에서 멀티플렉싱(Multiplexing)을 이용해 동시성을 보장하기 때문입니다.

즉, 유저 레벨에서는 싱글 스레드로 작동하지만, 커널 I/O 레벨에서는 스레드 풀을 이용합니다. 이러한 동시성 특성 때문에 동시성 관련 에러가 발생할 수 있으므로 적절한 동시성 처리가 필요합니다.

Redis의 트랜잭션 처리

Spring Data Redis를 기준으로 트랜잭션을 처리하는 방법은 두 가지가 있습니다:

1. SessionCallback 인터페이스 사용: 여러 명령을 하나로 묶어서 처리하는 방법으로, 인터페이스를 통해 직접 Redis 명령어를 사용하여 트랜잭션 경계를 설정합니다. 2. @Transactional 어노테이션 사용: 더 간편하게 트랜잭션을 처리할 수 있는 방법입니다.

관련 항목