실전프로젝트 2주차. 오늘은 오전에 공부를 하고, 오후에 프로젝트 피드백을 받았다. 오늘의 TIL에는 Redis에 대한 내용을 정리해보려 한다.
REmote DIctionary Server 원격 딕셔너리 자료구조 서버
Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 DBMS.
DB, 캐시, 메세지 브로커로 사용되며 모든 데이터를 메모리로 불러와서 처리하는 메모리기반 DBMS. 모든 데이터가 서버의 주 메모리에 상주하는 인메모리 방식이라 디스크에 엑세스 할 필요가 없어 매우 빠르게 데이터에 접근이 가능하다.
영속성을 지원하기 때문에 인메모리 저장소지만 프로그램이 종료되더라도 데이터가 사라지지 않는다.
Key-Value 구조이기 때문에 쿼리를 사용할 필요가 없다.
데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도가 빠르다.
싱글 쓰레드로 동작하기 때문에 데이터에 접근할 때 여러 쓰레드들에 대한 동기화를 고려하지 않아도 된다. 하지만 동시에 처리할 수 있는 명령어가 한번에 1개기 때문에 처리시간이 긴 명령어가 들어오면 그 뒤의 명령어가 대기상태가 되어 성능 저하가 일어날 수 있다.
ex) Keys(모든 데이터 조회), FlushDB(모든 데이터 삭제), Delete Collections(컬렉션 전부 삭제), Get All Collections(컬렉션 전부 조회) 같은 명령어들은 사용 조심!!
복제(Replication)기능이 있어 서버에 장애가 생겨 중단될 경우 기존의 데이터를 지킬 수 있다. 하지만 복제 과정이 비동기적이라 모든 데이터를 가지고 있지 않을 수도 있긴 하다.
샤딩(Sharding) 기능이 있어 데이터를 특정 조건에 나누어 저장할 수 있다. 샤딩을 통해 더 많은 데이터를 저장하고, 쓰기 성능을 개선할 수 있다.
기본적인 Key의 자료형은 String이지만 Value는 다양한 타입을 지원한다.
Lists, Sets, Sorted Sets, Hashes 등의 자료구조를 사용가능하다.
String : 가장 기본적인 자료구조. 문자열을 저장하고 조회. 문자열 외에도 정수, 실수 등의 숫자 데이터도 저장 가능. 삽입과 조회에 O(1)
Lists: 여러 아이템을 순서대로 저장하는 Array 형식의 데이터 구조.
데이터 삽입의 시간복잡도는 맨 앞이나 맨뒤에 넣기 때문에 O(1)
, 조회 시 O(N)
큐나 스택으로 사용할 수 있고, 고정된 길이로 사용해 데이터가 넘치면 버릴 수 있다.
스택 방식으로 최근 방문 페이지, 타임라인, 최근 방문자 등에 사용이 가능하다.
Sets: 순서 보장이 안되지만 중복을 허용하지 않는 자료구조. 집합 연산을 지원해(교집합, 합집합 등) 유저간 관계나 태그, 관심사 등을 표현하는데 유용하다.
삽입에 O(1)
, 하나 조회시 O(1)
, 전체 조회시 O(N)
, 집합 조회시 O(N) 이상
Sorted Sets: Sets와 유사하지만 Key-value 뒤에 Score를 지정할 수 있다. Score를 기준으로 정렬된 상태로 저장된다.
삽입 제거에 O(log N)
, 범위 조회시 O(log (N) + M)
, key로 조회시 O(log N)
Hashes : Key-value 쌍을 저장하고 조회하는 자료구조. 큰 객체도 저장할 수 있어 대규모 객체를 캐싱할 때 매우 유용하다. 하나의 Key 안에 여러 필드와 값을 저장할 수 있어 관련된 데이터를 그룹화 하는데 유용하다.
key field를 아는 상태에서 삽입, 조회에 O(1)
, key만 가지고 조회 할 때는 O(N)
winpty docker exec -it myredis redis-cli
SET keyName "value"
GET keyName
DEL keyName
EXPIRE keyName 10
LPUSH listName "world"
RPOP listName
INCR keyName
MGET key1 key2 key3 key4...
EXIST key1 key2 key3
FLUSHALL