메모리에서 데이터를 관리하기 때문에 기본적으로 전원이 꺼지면 데이터가 삭제되는 휘발성의 특성을 가진다
따라서 내용을 보관하기 위해서는 디스크에 데이터를 저장하는 작업이 따로 필요하다
빈번하게 확인되고 수정되는 데이터지만 rdb를 들르기에는 병목이 가능할 때
레디스를 활용해서 더 빠르게 응답을 제공할 수 있다
이중 비즈니스에 중요한 데이터들은 영속성 설정이 필요하다
이는 레디스의 영속성을 활용해 실제로 데이터를 저장하고 조회하는 형태이다
*단순 캐시의 경우는 필요 없다(원본 데이터베이스를 애초에 따로 두는 경우이므로)
redis에서 제공하는 영속의 방식은
rdb 는 redis db를 의미한다
특정 시점에 데이터들을 하나의 파일로 저장한다
이는 dump.rdb로 압축된 바이너리 형식이다
따라서 사람이 읽을 수 없는 이진 데이터로 속도가 빠르다는 장점이 있다
background에서 실행한다는 점에서 snapshot을 만드는 동안 redis가 다른 명령을 처리할 수 있다
이가 가능한 이유는 부모 프로세스가 포크를 활용해 자식 프로세스를 만들고,
이 자식 프로세스가 rdb snapshot 생성을 맡아 부모가 클라이언트의 요청을 처리할 수 있기 때문이다
이는 copy on write 기반으로 동작한다
따라서 쓰기가 발생 시 부모는 쓰기 동작을 할 페이지를 복사해 할당받는다
자식이 읽어 rdb snapshot을 생성하고 있을 때, 해당 데이터와 공유되면 안되기 때문이다
따라서 전체 과정은 이와 같다
이를 통해 알 수 있듯,
rdb snapshot을 활용할 때는 주기적으로 데이터 파일을 만들어주게 된다
이에 따라 다음 스냅샷을 생성하기 전까지 데이터에 변경이 있을 때,
해당 데이터는 따로 저장되어있지는 않다
그렇기 때문에 서버가 다운되는 것과 같은 문제가 발생했을 때
스냅샷에 저장되지 않은 변경 데이터는 유실될 수 있다는 단점이 있다
포크 시 메모리 여유 공간 필요
cow를 활용하기 때문
최악의 경우 스냅샷 생성하는 중에 모든 데이터의 변경 발생 가능한데
그렇게 되면 모든 데이터 크기만큼의 공간을 따로 할당해줘야함
대용량의 경우 어쩔 수 없이 느림(io에 대한 비용 발생)