Redis

반응형

Introduction

 

이번에 Redis를 공부하면서 알게된 점들을 간략하게 정리해보려고 합니다. Redis란 무엇이며, 어떤 상황에 어떻게 쓰이는지, 어떠한 자료구조를 가지고 있고, 어떤 기능들을 가지고 있는지 요점을 정리해 Redis란 무엇인지 알 수 있는 시간이 되었으면 합니다.

 

Redis

Redis 란 NoSQL의 한 종류로써 데이터를 쓰고, 읽는 데이터베이스입니다. NoSQL 이기 때문에 스키마가 존재하지 않고, 특정한 자료구조의 형태로 쓰고, 읽는 것이 가능합니다. 일반적인데이터베이스와 다른 점이라면  Redis 는 데이터들을 직접 디스크에 write 하지 않습니다. 메모리에 데이터를 적재하고, 메모리에 있는 데이터를 사용하는 In-Memory 구조를 갖습니다. 그렇기 때문에 빠른 속도로 데이터를 쓰고, 읽는 것이 가능합니다.

 

 

1.  Redis. 어디에 사용해야 할까 ? 

Redis 는 디스크에 직접 write 하지 않기 때문에 빠른 속도로 데이터를 쓰고, 읽을 수 있습니다.
이 말인 즉슨 잦은 I / O 로 디스크에 빈번하게 접근해야하는 경우에 Redis 를 활용할 수 있습니다. 가장 보편적인 예로 조회수가 있습니다. 유튜브 같은 스트리밍 사이트의 동영상 조회수나 특정 검색어의 조회수 등으로 인기 동영상, 인기 검색어 등의 기능을 구현 하려고 할때 효율적으로 활용할 수 있습니다.

그 외에도 API 캐싱 기능이 있습니다. 만약 조회하는 데이터가 많은 연산을 필요로 하는 경우라면 매번 요청마다 연산을 진행해야 하기 때문에 감당하기 힘든 큰 리소스가 발생하는 경우가 있을 수 있습니다. 그러한 요청에 필요한 연산을 1회만 수행하고, 데이터를 메모리에 적재한 이후 동일한 요청에는 메모리에 있는 값을 클라이언트에게 답변하면 되기 때문에 UX 측면에서 높은 품질을 제공할 수 있습니다. 

직접 만듬

 

2.  자료구조

Redis 는 Low-Level 의 기본적인 자료구조를 제공합니다.  기본적으로 key-value 형태로 사용합니다.

- String : 기본 문자열를 삽입합니다.

- List : 중복 데이터를 허용하고, 순서를 보장합니다.

- Set : 중복 데이터를 허용하지 않고, 순서를 보장하지 않습니다.

- ZSet : 중복 데이터를 허용하지 않고, score란 값으로 순서를 보장합니다.

- Hash : key 하나에 여러개의 key-value 를 가질 수 있다. 

이미지 출처 (https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=fltltmxjs&logNo=80195023188)

 

2.  Persistence

컴퓨터의 메모리는 휘발성이기 때문에 전력의 공급이 멈춘다면 쓰여 있던 데이터들은 지워집니다. 그렇기 때문에 메모리에 값을 쓰고, 읽는 Redis 는 예기치 못한 장애를 만나 컴퓨터의 전력의 공급이 멈추는 등의 문제가 생긴다면 쓰여 있던 데이터들을 모조리 잃을 수 있습니다. 그러한 문제점들을 해결하기 위해 RDB, AOF 방식의 디스크 쓰기를 지원합니다.

2-1.  RDB ( snapshotting )

Redis 는 환경설정을 통해 데이터를 디스크에 쓸 수 있는 snapshot 기능을 제공 합니다. 특정 시간과 조건을 설정 파일에 기입을 하면, 설정에 따라 캐싱된 데이터들을 디스크에 씁니다.

먼저 환경설정 파일을 찾기 위해 ^ + command + . 를 눌러서 숨김 파일 및 폴더 표시를 해줍니다. 그리고 사진과 같은 경로로 들어가게 되면 'redis.conf' 파일을 찾을 수 있습니다.

homebrew로 redis를 설치하였을 경우의 default 주소

 

그리고 환경 설정 파일을 텍스트 편집기로 열고 'snapshotting'를 검색해줍니다.

redis.conf 파일의 RDB 설정 부분

그리고 원하는 설정을 기입 해줍니다.


'SAVE 60 1' = 60초 동안 1번의 쓰기가 일어나면 저장
'SAVE 300 14' = 300초 동안 14번의 쓰기가 일어나면 저장

 

설정을 한 후에 원하는 조건을 충족하게 된다면 RDB 설정 부분 아래에 있는 파일 설정(경로나 이름을 설정할 수 있습니다. )에 따라 dump.rdb 파일이 생성됩니다.


dump.rdb 파일은 바이너리로 쓰이기 때문에 AOF 파일보다 가볍고, 사용자가 파일을 직접 확인할 수 없습니다. 하지만 redis 에서 특정 명령어를 통해 조회가 가능하고, 만약 새로운 디스크 쓰기가 일어난다면 기존파일은 삭제하고, 새로 생성하는 방식 입니다.

RDB에서 save를 하는 방식은 두 가지로 나뉩니다. 일반 save와 bgsave 입니다. save는 쓰기 작업을 할때 서버 프로세스를 사용하기 때문에 다른 작업을 블록처리 합니다. (쓰기 작업량이 많아서 길어질 경우 Redis의 다른 기능 사용 불가) bgsave는 또 하나의 프로세스를 생성한 후에 작업을 처리하기 때문에 블록처리가 되지 않습니다. 하지만 메모리 사용량이 많아지는 단점도 있기 때문에 상황에 따라 선택해 사용하면 됩니다. 

RDB 방식은 만약 조건과 조건 사이에 예외의 상황이 발생해 서버가 종료될 경우 그 사이의 일어난 데이터들은 유실될 수 있습니다.

 

2-2.  AOF(Append Only File)

데이터들의 변경사항(조회 제외)들을 순차적으로 저장합니다. AOF 파일은 text 형식으로 되어 있기 때문에 직접 수정이 가능하고, RDB 파일보다 무겁습니다. 데이터의 최종본을 얻기 위해서 쓰여진 모든 작업들을 순차적으로 다시 수행하기 때문에 파일을 읽는데 시간이 소요 됩니다. 그렇기 때문에 특정 시점에 다시 쓸 수 있는 기능을 제공합니다.

'redis.conf' 파일에서 'APPEND ONLY MODE' (AOF 설정 부분) 을 검색합니다. 바로 아래에 사진과 동일한 설정 부분이 있습니다. 'appnedonly no' 부분의 값을 yes로 할 경우 AOF 모드가 실행됩니다. 



AOF 방식으로 저장될 파일도 설정을 통해 경로와 이름을 변경할 수 있습니다. 

 

 

AOF 사용시 sync를 선택할 수 있습니다.

appendfsync alway = 변경사항이 발생하는 모든 경우 저장
appendfsync everysec = 매 초마다 저장

appendfsync no = fsync 사용하지 않음

 

 

AOF Re-Write 의 크기 설정은 0~100% 까지 가능합니다. 기준은 Redis 실행시의 AOF 파일 크기입니다.
너무 잦은 쓰기를 방지하기 위해서 최소 용량 설정이 가능합니다.

 

AOF 방식은 변경사항들을 매번 디스크에 쓰기 때문에 성능이 느리고, 쓰기 부하가 있을 수 있습니다. 하지만 데이터의 정합성과 유실을 방지할 수 있습니다.

 

Redis-Server를 실행할 때 파일을 읽어 들이는 기본 설정은 만약 AOF 가 yes 로 설정되어 있다면 AOF 파일을, no 로 설정되어 있다면 dump.rdb 파일을 읽습니다.

 

3.  Persistence 활용

일반적으로 디스크에 쓰기 위해 제공 되는 두 가지 방식( RDB, AOF) 중에 한 가지만을 선택하는 것이 아닌 혼용으로 사용하는 것을 권장하고 있습니다. RDB 의 저장방식으로 snapshot이 실행될 경우 AOF 파일을 다시 쓰는 등의 방식으로 활용 한다면 AOF 파일의 크기도 제한적이기 때문에 좀 더 원할한 사용이 가능할 것 같습니다.

 

 

반응형