Redis는 in-memory 데이터 베이스 혹은 데이터 구조 서버라고도 한다. Redis는 TCP Socket과 간단한 프로토콜을 가진 서버-클라이언드 모델을 사용하여 전송되는 명령을 통해 가변 데이터 구조에 대한 접근을 제공한다.
기본적으로 메모리에 데이터를 저장하여 다른 데이터 베이스에 비해 빠른 속도로 저장/접근할 수 있으며 단순한 Key/Value 방식의 저장이 아닌 다양한 자료구조를 제공한다.
메모리에 데이터를 저장하다보니 휘발성에대한 고려를 해야하는데 redis는 데이터를 영구적으로 저장할 수 있으며, 여러서버에서 같은 데이터를 사용할 수 있도록 Pub/Sub 구조를 제공하고 클러스터 구성도 제공한다.
Redis의 강점 중 하나는 자료구조들을 제공한다는 것이다. 그리고 이 자료구조들은 Atomic하기 때문에 Race condition 문제를 피할 수 있다.
Expires 옵션으로 그 시간 후에 해당 자료구조를 지운다.(아이템 단위가 아니다)
일반적인 문자열로 512MB까지 지원하며 Binary safe
라고 표현하는데, 이진 시퀀스나 JPEG같은 파일도 저장할 수 있으며, 빈 문자열로 key로 사용 가능하다.
SET <KEY> <VALUE>
GET <KEY>
데이터베이스는 많은 저장 연산을 최대한 빠르게 처리해야하므로 Linked Lists를 선택했다고 한다.
그래서 head나 tail에추가 연산이 상수만에 가능하다.
유저들이 게시글을 작성할때 ID를 list에 push하고 사용자들이 방문할때 LRANGE 0 9
명령을 통해 최신 10개의 게시글을 보여주는 방법으로 사용할 수 있다.
LPUSH <KEY> <VALUE> // Left(head)에 푸시
RPUSH <KEY> <VALUE> // Right(tail)에 푸시
LPOP <KEY> //Left(head) POP
RPOP <KEY> //Right(tail) POP
정렬되지 않은 스트링 집합으로 값이 이미 존재하는지 혹은 서로다른 set 끼리의 intersection, union, 차이를 출력하는등의 기능을 제공한다.
SADD <KEY> <VALUE> //set에 원소 추가
SMEMBERS <KEY> //set 원소 모두 출력
SISMEMBER <KEY> <VALVUE> //존재한다면 1 없으면 0
set과는 다르게 score를 줄 수 있고, score 값을 기준으로 정렬이 가능하다.
ZADD <KEY> <SCORE> <VALUE> // Sorted set에 원소 추가
ZRANGE <KEY> <STARTINDEX> <ENDINDEX> // startIndex~endIndex 값 반환
Key안에 SubKey-SubValue가 들어가있는 형태이다.
HMSET <KEY> <SUBKEY1> <SUBVALUE1> <SUBKEY2> <SUBVALUE2> // 원소 추가
HGET <KEY> <SUBKEY1> // SUBVLAUE1 반환
HMGET <KEY> <SUBKEY1> <SUBKEY2> // SUBVALUE1 SUBVALUE2 반환
인메모리 데이터베이스이다 보니까 메모리 관리다 당연히 중요하다. Physical Memory이상을 사용하면 디스크에 Swap되므로 Page접근시 마다 시간이 늦어진다.
Redis는 싱글쓰레드다. 따라서 O(N)의 작업이 실행되고있으면 다음 명령들은 계속 기다리고있어야한다.