Redis(Remote Dictionary Server)는 인메모리 데이터베이스로, 디스크에 데이터를 저장하는 다른 데이터베이스들(MySQL, Oracle 등)과는 다르게 Redis는 메모리에 데이터를 저장해서 더 빠르게 데이터를 가져올 수 있다. 캐싱이 가능하고, 다양한 자료구조를 저장할 수 있다. 또한, Redis는 NoSQL 데이터베이스다.
메모리는 휘발성으로 서버가 꺼지면 데이터가 모두 사라지게 된다.
Redis는 스냅샷과 AOF를 사용하여 영속성을 보장해 준다.
Redis의 영속성
스냅샷
특정 시점의 메모리를 사진 찍듯이 그대로 디스크에 저장하여 데이터 영구 저장한다.
메모리의 스냅샷을 그대로 저장해 두었기 때문에, 서버를 재시작 시 스냅샷만 불어오면 된다.
하지만, 스냅샷을 추출하는데 오랜 시간이 걸리며, Redis가 중간에 장애가 생겨 멈추면 마지막으로 백업한 스냅샷 이후의 데이터를 잃는다.
AOF(Append Only File)
Redis가 수신하는 모든 쓰기 명령어를 AOF 파일에 기록해 두고, 서버가 재시작 시 명령어를 다시 실행하여 원래 상태로 만든다.
데이터의 유실이 발생하지 않는다는 장점이 있지만, AOF 파일은 스냅샷에 비해 더 많은 디스크 용량을 차지한다. 또한, 모든 명령어를 파일에 기록하므로 스냅샷에 비해 더 느린 응답시간을 제공한다.
따라서, 스냅샷과 AOF 방식을 혼합하여 사용하는 것을 권장한다. 주기적으로 스냅샷으로 백업하고, 다음 스냅샷까지의 저장을 AOF 방식으로 수행한다. 그렇다면 서버가 재시작될 때, 백업된 스냅샷을 불러오고, 소량의 AOF 로그만 사용하면 되기 때문에, 재시작 시간을 절약하고 데이터의 유실을 방지할 수 있다.
Redis의 자료구조
Redis는 key-value 저장소로, String, Set, Sorted Set, Hash, List로 5가지의 value 형태를 지원한다.
키 하나에 데이터형 하나가 저장되는 단순한 구조를 가진다. 이는 저장된 데이터를 가공하는데 제한이 있다는 단점이 있지만, Redis는 다양한 종류의 데이터형과 명령들을 통해 보완하고 있다.
Redis 운영시 주의사항
메모리 관리
Redis는 메모리에 데이터를 저장하기 때문에 메모리 관리가 매우 중요하다. 메모리를 넘어가는 용량을 처리 시 swap을 사용한다. 하지만, swap 시 디스크에 정보를 넣었다 빼야 하기 때문에 지연이 발생한다. 또, 메모리를 사용하는 만큼 메모리 파편화 문제가 발생한다. 다양한 사이즈를 가지는 데이터보다는 유사한 크기의 데이터를 저장하는 경우 메모리 파편화를 조금이라도 피해 갈 수 있다.
O(N)의 명령어 사용 자제
Redis는 싱글 스레드로 동작한다. 싱글 스레드는 한 번에 하나의 명령어 밖에 처리하지 못한다. 따라서, 시간이 오래 걸리는 명령어를 처리하는 동안 다른 명령어를 수행하지 못해 전체적으로 느려질 수 있다. 따라서, O(N)의 시간 복잡도를 가지는 명령어(Keys, FlushALL 등)를 사용 시에 속도가 느려질 수 있다.
'CS > 데이터베이스' 카테고리의 다른 글
DB Lock (0) | 2023.07.04 |
---|---|
데이터베이스와 캐시 (0) | 2023.06.28 |
RDBMS vs NoSQL (0) | 2023.06.27 |
트랜잭션 격리 수준 (0) | 2023.06.26 |
트랜잭션과 Lock (0) | 2023.06.26 |