Redis

Redis 란?

illho 2024. 4. 13. 13:12

Redis 란?

 

Redis는 오픈 소스 기반의 고성능 키-값 저장소이며, 메모리 내 데이터 구조 저장 및 검색을 위한 데이터베이스로 사용한다. Redis는 NoSQL 데이터베이스 중 하나로, 주로 캐싱, 세션 관리,메시지 브로커, 대기열 처리 등 다양한 용도로 활용된다.

 

Redis는 특히 메모리 내 데이터 저장으로 빠른 응답 속도를 제공하며, 디스크에 데이터를 지속적으로 저장하여 데이터 손실을 방지할 수 도 있다. 또한 다양한 데이터 구조를 지원하며, 문자열, 리스트, 해시, 집합, 정렬 집합과 같은 데이터 타입을 다룰 수 있어 다양한 어플리케이션에서 활용 가능하다.

 

데이터 베이스가 있음에도 불구하고 Redis를 사용하는 이유?

 

데이터베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생해도 데이터가 손실되지 않는다.

하지만 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있다.

데이터 베이스가 과부하가 될 수 있기 때문에 캐시 서버를 도입하여 사용한다.

캐시 서버로 이용할 수 있는 것이 Redis 이다. Redis는 인메모리 데이터 구조 저장소를 사용하기 때문이다.

캐시는 한번 읽어온 데이터를 임의의 공간에 저장하여 다음에 읽을 때는 빠르게 결과값을 받을 수 있도록 도와주는 공간이다. 

 

특징 및 장점

1. 인메모리 데이터베이스 : Redis는 데이터를 메모리에 저장하므로 빠른 응답 속도를 제공한다.

2. 다양한 데이터 타입 : Redis는 문자열, 리스트, 해시, 집합, 정렬 집합과 같은 다양한 데이터 구조를 지원한다.

3. 영속성 : Redis는 디스크에 데이터를 주기적으로 저장하여 데이터의 지속성을 제공한다. 이를 통해 시스템 장애 시에도 데이터 손실을 방지할 수 있다.

4. Pub-Sub 메시징 : Redis는 Publish-Subscribe 메커니즘을 지원하여 메시지 브로커로 사용할 수 있다.

이를 통해 이벤트 기반 시스템을 구축하거나 메시지 전달에 활용할 수 있다.

5. 트랜잭션 / 싱글 스레드 : Redis는 멀티 명령어를 원자적으로 실행하는 트랜잭션을 지원한다. 

Redis는 싱글 스레드 기반으로 동작한다.

6. 클러스터링 : Redis는데이터 샤딩과 레플리케이션을 통해 고가용성 및 확장성을 제공하는 클러스터를 구성할 수 있다.

7. LRU 캐시 및 만료 시간 : Redis는 데이터를 자동으로 관리하기 위해 LRU 알고리즘과 만료시간을 지원한다.

 

Redis 데이터의 영속성

 

Redis는 인메모리 데이터 DB 임에도 불구하고 메모리 데이터를 disk에 저장할 수 있는 특징이 있다.

서버가 꺼진 후 restart되더라도, disk에 저장해놓은 데이터를 다시 읽어서 메모리에 로딩하기 때문에 데이터가 유실되지 않는다. 이런 영속성 기능은 휘발성 메모리 DB를 데이터 스토어로서 활용한다는 장점이 있지만 이 기능 때문에 장애의 주 원인이 되기도 한다.

 

Redis에서는 데이터를 저장하는 방법이 RDB 방식과 AOF 두가지가 있다.

 

RDB 방식은 특정한 간격마다 메모리에 있는 레디스 데이터 전체를 디스크에 쓰는 것이다.

AOF 방식은 명령이 실행될때 마다 데이터를 파일에 기록하여 데이터의 손실이 거의 없다.

 

RDB 

RDB는 순간적으로 메모리에 있는 내용을 스냅샷을 떠서 DISK에 옮겨 담는 방식이다.

스냅샷을 뜬다는 말은 특정 시점의 메모리에 있는 데이터를 바이너리 파일로 저장한다는 뜻이다.

우리가 직접 세팅하지 않아도 Redis는 자동으로 .rdb 라는 확장자의 파일에 인메모리 데이터를 저장하도록 디폴트 설정이 되어있다.

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

 

AOF

AOF 방식은 redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태이다.

디폴트로 appendonly.aof 파일에 기록되며, 조회를 제외한 입력/수정/삭제 명령이 실행될 때 마다 기록된다.

그리고 서버가 재시작될때, log에 기록된 write/update 연산을 재 실행하는 형태로 데이터를 복구하는 방식이다.

 

AOF 는 다음과 같은 순서로 데이터가 저장된다.

1. 클라이언트가 Redis에 업데이트 관련 명령을 요청한다.

2. Redis 는 해당 명령을 AOF에 저장한다.

3. 파일쓰기가 완료되면 실제로 해당 명령을 수행해서 Redis 메모리 내용을 변경한다.

 

이처럼 동작이 발생할때 마다 매번 기록하기 때문에 RDB방식과는 달리 항상 현재 시점까지의 로그를 기록할 수 있다. 

AOF는 log 파일에 대해서만 append 하기 때문에 log write 속도가 빠르고 어떤 시점에 서버가 다운되더라도 데이터가 사라지지 않는 장점이 있다.

 

Redis의 자료구조

  • Strings : 문자열 데이터를 저장 및 조회할 수 있는 자료구조 기본적인 key-value 구조
  • Lists : String element의 모음, 순서는 삽입된 순서를 유지하며 기본적인 자료구조 Linked List를 사용
  • Sets : 유일한 값들의 모임인 자료구조, 순서는 유지되지 않음
  • Sorted sets : Sets 자료구조에 score라는 값을 추가로 두어 해당 값을 기준으로 순서를 유지
  • Hashes : 내부에 key-value 구조를 하나더 가지는 Redis 자료 구조
  • Bit arrays : bit array를 다룰 수 있는 자료구조
  • HyperLogLogs : HyperLogLog는 집합의 원소의 개수를 추정하는 방법, Set 개선된 방법
  • Stream : Redis 5.0에서 Log나 IoT 신호와 같이 지속적으로 빠르게 발생하는 데이터를 처리하기 위해서 도입된 자료구조 

Strings 

  • 값의 최대 길이는 512MB이다.
  • APPEND 명령어를 통해 값에 어펜드가 가능하다.
  • INCR, DECR, INCRBY 명령어를 통해 Atomic counters를 구현할 수 있다. 
  • set, get 명령어 사용

 

여러개 set , get 할때

 

Lists

  • 중간에 추가/삭제가 느림, head-tail에서 추가/삭제
  • O(n)의 탐색시간이 걸리는 성형 탐색
  • queue 형태로 사용하는것이 좋음

 

 

 

 

Sets

  • 유일한 값
  • 팔로워 리스트, 친구리스트 => 특정 그룹의 사용
  • Spirng Security Oauth 의 Access Token을 저장하는 Redis Token Stroe 방식

 

Hashes

  • 일반적인 key-value 형태
  • 특정군의 data로 묶기
  • key 하위에 subkey를 이용해 추가적인 Hash Table을 제공하는 자료구조

 

 

Sorted Set

  • 아이템들의 랭킹을 가지는데에 사용
  • Double 형태, 특정 정수값을 사용할 수 없음
  • Skiplist 자료구조 

 

Reference

 

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%81%EA%B5%AC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EC%98%81%EC%86%8D%EC%84%B1

 

https://velog.io/@dev_lee/Redis-%EB%A0%88%EB%94%94%EC%8A%A4-%EC%86%8C%EA%B0%9C%EC%99%80-%ED%8A%B9%EC%A7%95-%EB%B0%8F-%EC%9E%A5%EC%A0%90-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%8B%A4%EC%A0%9C-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80

 

https://wildeveloperetrain.tistory.com/21