Redis는 영속성 보장을 위해 데이터를 디스크에 저장할 수 있다.
서버가 내려가더라도 디스크에 저장된 데이터를 읽어서 메모리에 재로딩한다.
저장방식은 크게 두 가지로 나뉜다.
1. RDB (snapshotting) 방식
: 일정 인터벌로 메모리에 있는 내용(데이터) 전체를 디스크에 옮겨 저장한다.
restart 시간이 빠르지만 멈췄을 때 데이터 유실 가능성이 더 높다.
몇 분 정도의 데이터 유실 가능성을 감내할 수 있다면 RDB 방식이 추천된다.
2. AOF (Append On File) 방식
: Redis의 모든 Write/Update 연산 자체를 log 파일에 저장한다.
읽기 쉬운 포멧이지만 RDB보다 용량이 크고, write 리퀘스트가 많을 때 RDB보다 반응성이 느리다.
Redis는 단순한 key-value 쌍(문자열)이 아니라 다양한 데이터 구조체를 지원하는데, 이를 컬렉션이라 부른다.
(출처:https://loosie.tistory.com/803)
이처럼 key 값으로 넣을 수 있는 데이터 구조가 매우 다양하다.
싱글 스레드를 사용하여 연산을 원자적으로 처리한다. 따라서 Race Condition에 유리하다.
Race Condition : 공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태
but 빠르게 두 번 요청시 데이터가 두 개 발생하는 등의 더블 클릭 이슈는 싱글 스레드만드로 해결 불가능하다.
Redis는 Single Thread로 동작하므로, 한 사용자가 오래 걸리는 커맨드를 실행하면 나머지 요청들은 전부 대기하게 되어 장애가 빈번히 발생한다. (만일 하나의 명령어가 1초가 걸리는 작업을 하면 남은 명령어는 1초동안 대기하게 되는데 모두 timeout이 발생하여 서비스가 터지게 된다. 보통 timeout = 200~300ms)
따라서 시간복잡도 O(n)가 걸리는 명령어들은 최대한 사용을 삼가야 한다.
Redis를 캐시로 사용할 때는 Key에 대한 Expire Time을 설정하는 것이 권장된다. 설정하지 않는다면 금방 메모리가 가득차게 된다.
Redis는 데이터가 가득찼을 때 MAXMEMORY-POLICY 정책에 의해 데이터가 삭제된다.
Redis는 메모리를 사용하는 저장소이므로 메모리 관리가 아주 중요하다. 모니터링할 때 유의할 점은 used_memory가 아닌 used_memory_rss값을 보는 것이 중요하다는 것이다.
실제 저장된 데이터는 적은데 rss값이 큰 경우는 fragmentation이 크다고 말한다. 주로 삭제된 키가 많을 때 이 fragmentation이 증가한다. 이 때 activedefrag 기능을 잠시 켜두면 도움이 된다.
출처 : https://loosie.tistory.com/803,
https://steady-coding.tistory.com/586