기본적으로 데이터베이스를 떠올리면 RDBMS이 생각날 것이다. 하지만 RDBMS는 관계형 데이터베이스이라서 조인 연산 등으로 인해 성능이 떨어질 수 있다.
이러한 문제를 개선하기 위해 NoSQL이라는 비관계형 데이터베이스가 등장하였다.
NoSQL은 Not Only SQL의 약자로써 기존 관계형 데이터베이스(RDBMS)보다 더 융통성 있는 데이터 모델을 사용하고 데이터의 저장 및 검색을 위한 특화된 메커니즘을 제공하는 데이터 저장기술을 의미한다.
NoSQL 데이터베이스는 단순 검색 및 추가 작업에 있어서 매우 최적화된 키-값 저장 기법을 사용하여 응답속도나 처리 효율 등에 있어서 매우 뛰어난 성능을 나타낸다.
NoSQL에는 저장 방식에 따라 Key-Value, Wide Columnar, Document, Graph DB를 제공한다. 이들 중 Key-Value 저장 방식 중 하나인 Redis에 대해서 공부해보려 한다.
Redis에 대해서 공부하기 전에 캐시(Cache)를 살짝 보고 넘어가도록 하자.
Cache는 한번 조회된 데이터를 미리 특정 공간에 저장해놓고, 똑같은 요청이 발생하게 되면 서버에게 다시 요청하지 말고 저장해놓은 데이터를 제공해서 빠르게 서비스를 제공해주는 것을 의미한다.
캐시를 사용하는 패턴은 첫 번째로 Look aside Cache 패턴이다. 일반적인 캐시 정의를 그대로 구현한 구조이다.
두 번째로 Write Back 패턴이다. n개의 데이터 쓰기 요청이 발생하였을 때 DB에 insert 쿼리를 n번 날리는 것보다 n개의 데이터를 모은 후 DB에 insert 쿼리를 1번 날리는 것이 훨씬 성능이 좋다.
즉, Write Back 패턴은 쓰기 요청이 많을 경우 Cache에 먼저 데이터를 저장해놓고 특정 시점마다 모아서 DB에 저장하는 방식이다.
캐시는 인메모리 구조이기 때문에 쓰기, 읽기가 디스크보다 빠르기 때문이다.
다만, 캐시는 인메모리 구조로 장애가 발생 시 데이터가 사라지게 되는 위험이 존재한다.
캐시에 대해서 어느 정도 알아봤으니 본격적으로 Redis에 대해서 알아보도록 하자.
Redis는 Key-Value 기반의 In-Memory Data Structure Store이다.
Key-Value 기반이기 때문에 빠르게 원하는 데이터를 조회할 수 있으며, 인메모리 구조이기 때문에 디스크에 저장하는 방식보다 훨씬 빠른 속도로 데이터를 처리할 수 있는 장점이 있다.
즉, 인메모리 구조이기 때문에 DB뿐만 아니라 Cache로도 활용될 수 있다.
Redis를 주로 사용하는 곳은 다음과 같다.
- 인증 토큰 등을 저장(Strings or Hash)
- Ranking 보드로 사용(Sorted-Set)
- 유저 API Limit
- 잡큐(list)
Redis와 비교를 자주 하는 대상으로 Memcached라는 것이 존재한다. Memcached 역시 Key-Value 기반의 In-Memory Data Structure Store이다.
Redis | Memcached | |
코어 | 싱글 코어 | 멀티 코어 |
자료구조 | Strings, Set,, Sorted-Set, Hashes 등 다양한 자료구조 지원 | Strings, Intergers만 지원 |
데이터 저장 | Memory, Disk | Memory |
속도 | 읽기, 쓰기 속도가 Memcached보다 느림 하지만 큰 차이는 없음 |
디스크를 거치지 않기 때문에 읽기, 쓰기 속도가 Redis보다 빠름 |
복제 | Master-Slave, Multi-Master Replication 방식 지원 | 지원 X |
내구성 | Memcached보다 내구성이 뛰어남 | Redis보다 내구성이 떨어짐 |
영속성 | 영속성 데이터 사용 | 지원 X |
파이셔닝 방법 | 샤딩 지원 | 지원 X |
두 방식 모두 장단점이 존재하지만 Redis의 가장 큰 장점은 다양한 자료구조를 제공하는 것이다.
또한, Redis의 자료구조는 Atomic하기 때문에, Race Condition을 피할 수 있다.
즉, 다양한 데이터를 활용할 수 있는 자료구조가 이미 구현되어있기 때문에 비즈니스 로직에 집중할 수 있는 장점이 있다.
다만, 하나의 컬렉션에 너무 많은 데이터를 담으면 성능 저하가 발생할 수 있다.
Redis는 영속성을 지원한다. Expires를 설정하지 않으면 데이터를 디스크에 저장하기 때문에 캐시가 날아가도 데이터가 삭제되지 않는다.
주의해야 할 점은 Expires는 컬렉션 전체에 설정되는 것이며, 일부 데이터에 걸리는 것이 아니다. 따라서 컬렉션 전체 데이터가 사라지는 일이 발생할 수 있기 때문에 조심해야 한다.
Redis는 Single Thread를 사용한다. 즉, 한 번에 하나의 명령을 처리할 수 있다. 따라서 많은 시간을 수행하는 명령은 사용하면 안 된다.
처리하는데 시간이 많이 걸리는 명령어를 사용하면 그 명령어를 처리하는 동안 다른 명령어들은 기다려야 하기 때문이다.
참고로 단순한 get/set의 경우, 초당 10만 TPS 이상의 빠른 속도를 보여준다.
Redis는 Master-Slave, Multi-Master 방식의 Replication을 지원한다. 즉, 데이터를 Master 서버뿐만 아니라 다른 서버에도 복제하여 관리할 수 있다.
덕분에 Master 서버가 죽더라도 Slaver Server로 서비스를 유지할 수 있으며, 데이터의 분실 위험도 방지할 수 있다.
다만, 이를 위해 복제하는 과정에서 Master가 사용하고 있는 메모리를 fork 해야 하기 때문에 추가적인 메모리를 사용하며, 메모리 파편화 문제가 발생할 수 있다.
또한, Redis의 Replication은 Sync가 아닌 Async이기 때문에 주의해야 한다.
[ Reference ]
· https://www.youtube.com/watch?v=mPB2CZiAkKM
· https://www.geeksforgeeks.org/difference-between-redis-and-memcached/
'Computer Science > 데이터베이스' 카테고리의 다른 글
트랜잭션 고립화 레벨(Transaction Isolation Level) (0) | 2021.07.11 |
---|---|
개인키(대칭키) vs 공개키(비대칭키) (0) | 2021.07.10 |
NoSQL (0) | 2021.07.10 |
인덱스(Index) (0) | 2021.07.10 |
DML - JOIN (0) | 2021.07.10 |
댓글