실전프로젝트 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-cliSET keyName "value"GET keyNameDEL keyNameEXPIRE keyName 10LPUSH listName "world"RPOP listNameINCR keyNameMGET key1 key2 key3 key4...EXIST key1 key2 key3FLUSHALL