Redis에 대하여 위키백과에서는 다음과 같이 설명하고 있다
"키-값" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템(DBMS)
Redis도 흔히 알고 있는 Mysql, Oracle DB와 같이 데이터를 저장하기 위한 저장소라는 얘기이다.
조금 더 정확히는 비관계형(NoSQL) DBMS이기 때문에 MongoDB, HBase에 더 가깝다
Redis를 사용할때 가장 먼저 떠올리는 것은 Data에 접근하는 속도이다.
Redis는 Data를 Disk가 아닌 Memory에 저장한다
기존의 DBMS들은 데이터를 보관하기 위하여 Disk영역에 Data를 기록하였지만
Redis는 Memory영역에 Data를 기록하여 빠른 접근속도를 지원합니다
다만 동일한 용량이라하더라도 Memory는 Disk보다 더 비싸기 때문에 용량에 대한 제한이 있고 Memory의 휘발성으로 Data가 삭제될 가능성이 더 높기 때문에
Redis는 일반적으로 대용량 데이터를 지속적으로 보관하기 위한 Main DBMS에 적합하지는 않습니다
Redis에서는 Memory가 한계치에 도달했을때를 위한 몇가지 정책을 Configuration으로 제공하고 있습니다
명시적으로 Data 삭제를 요청할때까지 새로운 값을 추가하지 못한다거나, 사용한지 오래된 Data, 사용빈도가 적은 Data를 우선 삭제하는 등. Option에 대해서는 설치시에 Configuration 관련해서 정리가 필요할듯 하다
Remote Dictionary Server의 앞글자를 따서 Redis라고 한다
Redis는 그 이름처럼 Key-Value형태를 지원하는 DBMS입니다. Redis에서는 일반 String뿐 아니라 Lists, Sets, Sorted sets, Hash 등을 지원하여 프로그램 개발에 있어서도 용이합니다
List, Set, Sorted set, Hash 등을 지원한다
Redis는 IMDB의 일종으로 메모리의 휘발성 때문에 데이터 보관에 취약하다고 했지만 Redis는 이를 보완하기 위해 Memory와 Disk영역을 모두 활용한다
RDB(Redis Database) 방식 : 주기적으로 Snapshot을 Disk에 남김
AOF(Append Only File) 방식 : 쓰기 Log를 파일(Disk)에 저장하는 방식
AOF방식은 Data의 변경이 일어나는 쓰기동작에 대한 Log를 파일에 남겨두고 Redis Server가 기동시에 Log에 있는 동작을 재수행하는것으로 영속성을 보장한다
Log를 즉시 Disk에 기록하기 때문에 실시간으로 데이터의 "백업"이 이루어지고, 실수로 DB를 잘못 다루더라도 Log를 수정하면 데이터의 복원도 가능하다는 장점이 있다
반면 AOF는 쓰기동작(Insert/Update/Delete)에 관한 모든 로그를 기록하기 때문에 쓰기동작이 빈번하게 발생하는 경우 로그 사이즈가 굉장히 증가하게 되고 복원시 시간이 오래걸린다는 단점이 있다.
RDB 방식은 Redis의 Data를 압축하여 그대로 저장하기 때문에 저장하는 크기도 상대적으로 작고 "복원"속도도 빠르다
반면 실시간으로 데이터의 백업이 이루어지지 않기 때문에 스냅샷을 남기기전에 문제가 발생하는 경우 데이터의 유실이 발생 할 수 있다
또한 데이터 전체를 백업하기 때문에 백업속도는 상대적으로 느리다
RDB 방식으로 스냅샷을 남기고 다음 설정시간까지의 데이터는 AOF로 백업을 진행하는 방식이다. 두가지 방식의 장점을 얻고 단점을 상호 보완할 수 있어 많이 사용하는 방식이다.
Redis는 Single Thread로 동작합니다
그렇기 때문에 한번에 하나의 요청만을 처리하고 이를 통해 원자성(Atomic)을 보장한다고 하는데 이렇게만 보면 잘 이해가 되지는 않는다
한번에 하나의 요청만을 처리하기 때문에 Race Condition에 의한 데이터 불일치가 발생하지 않을 수 있고
또한 하나의 요청을 순차처리하기 때문에 장시간이 걸리는 요청이 있다면 뒤의 요청들이 밀려 지연이 발생 할 수 있다는 설명들을 가볍게 보면 이해가 된다
하지만 Redis에서 AOF방식의 Log를 수정하는것 외에 자체적으로 Rollback을 지원하지 않고 있고
여러 서버에서 동시에 접근시에 다른 DBMS들과 동일하게 보장이 되는지에 대해서는 의문이 남은 상태이니
우선은 Single Thread로 동작한다는것만 인지하고 원자성과 트랜잭션에 대한 부분은 조금 더 찾아봐야겠다
Redis는 위와 같은 특징들이 있기 때문에 캐싱서버, 세션관리와 같은 기능을 지원하기 위해 많이 사용된다. 메인 DBMS로 데이터를 보관하는것에는 문제가 있지만 IoT단말과 같이 통신이 주를 이루거나 인증에 관한 경우 Main DBMS의 부하를 줄이고 시스템 성능을 높일수 있다