In-memory data structure store
- 데이터베이스, 캐시, 메시지 브로커, 스트리밍 엔진 등에 사용됨
High Performance
- 싱글 스레드 기반으로 메모리를 이용한 고성능 처리
- 단 I/O, 백그라운드 작업을 처리하는 스레드는 따로 존재
- 핵심인 데이터를 처리하는 스레드는 싱글 스레드로 동작
다양한 자료구조를 지원함
- strings, hashes, lists, sets, sorted sets, bitmaps, hyperloglogs, geospatial indexes, streams
Redis 설치
Step 1. Redis의 소스 파일을 다운로드
Step 2. 소스 파일의 압축을 해제하고, 컴파일
- tar -xzvf redis-stable.tar.gz
- 압축 해제된 디렉토리로 이동
- make
- ※ make -j4 로 실행하게 되면 코어 수에 따라 높은 수준의 속도 향상이 있다.
Step 3. Install
- make install을 실행하면 /usr/local/bin 디렉토리에 redis-server, redis-cli 등 바이너리들이 install 된다.
- 이렇게 하면 어느 디렉토리에서든 redis-server, redis-cli 명령어를 통해 실행시킬 수 있다.
redis-cli 기본 명령어 정리
keys [pattern]
- 패턴에 해당하는 key를 리턴
- keys *와 같이 전체 키를 조회할 수 있으나 권장되지 않음
type [key]
scan [cursor] [pattern] [count] [type]
- 전체 키를 재귀적으로 조회함
- ex) scan 1
- 1)에는 다음에 스캔할 번호(커서)가, 2)에는 저장된 key의 목록이 출력됨
- 만약 1)의 값이 “14” 였다면, 다음에는 “scan 14” 명령어를 통해 키를 조회할 수 있음
- cursor의 값이 0인 경우 모든 키를 조회한 것임
- count 옵션으로 반환되는 양을 조정할 수 있음
- 시스템의 부하가 keys *보다 적음
flushall
자료구조 별 명령어 정리
Strings
set [key] [value] (EX seconds)
- key-value 엔트리로 저장
- EX는 옵션이며, EX 다음 패러미터 시간이 지난 후 해당 키를 expire
setnx
- key가 없을 때만 set
- key가 set되면 OK, 이미 존재하면 (nil) 리턴
- set 옵션에 nx를 추가하여도 같은 효과
get [key]
mget [key1] [key2…]
incr [key]
- key의 value가 정수 형태일 때, 해당 정수를 1 증가
incrby [key] [increment]
- key의 value가 정수 형태일 때, 해당 정수를 [increment] 만큼 증가
Lists
- string 값으로 이루어진 LinkedList 자료구조
- 스택과 큐를 구현할 때 사용
LPUSH [key] [element1] [element2…]
- key를 맨 앞 인덱스(head)에 삽입
- element의 개수는 여러 개가 될 수 있음
- ex) LPUSH list 1 2 3 => 3 2 1 저장
RPUSH [key] [element1] [element2…]
- key를 맨 뒤 인덱스(tail)에 삽입
- element의 개수는 여러 개가 될 수 있음
- ex) RPUSH list 1 2 3 => 1 2 3 저장
LLEN [key]
LRANGE [key] [start] [end]
- key의 start부터 end까지의 인덱스를 반환
- start를 0, end를 -1로 지정하면 해당 리스트의 모든 범위를 반환
LTRIM [key] [start] [end]
- key의 인덱스를 start ~ end 까지 남기고 삭제
LMOVE [source] [dest] [source | LEFT/RIGHT] [dest | LEFT/RIGHT]
- source에서 dest로 source의 head를 옮길 것인지, tail을 옮길 것인지 dest의 head에 옮길 것인지, tail에 옮길 것인지 선택
- 리스트를 그대로 옮기는 것이 아닌, head 또는 tail 중 하나의 원소만 옮기는 것
Set
- 순서 없는(unordered) 고유한(unique) 문자열의 집합
- 고유한 항목을 추적하거나 관계 등을 나타내기 위해 사용
SADD [key] [member] [member…]
- key에 대한 member를 추가
- 해당 키에 대한 member가 존재하지 않으면 1 반환, 존재하면 0 반환
- 하나의 키에 대해 여러 멤버가 존재할 수 있음
SISMEMBER [key] [member]
- key에 해당 member가 존재하는지 확인
- 존재하면 1, 존재하지 않으면 0 반환
SINTER [key] [key]
SCARD [key]
SREM [key] [member]
Sorted Set
- 정렬된 set 자료구조
- ‘score’를 이용해 set을 정렬함
- 리더보드 등에서 활용 가능
ZADD [key] [score] [member] [score…] [member…]
- key에 score를 정하여 member를 추가
ZRANGE [key] [start] [stop] [option: rev]
- key에 대한 멤버를 start ~ stop까지 반환
- rev 옵션을 추가하면 역순(내림차순)으로 반환
ZRANK [key] [member]
- key에서 member의 순위(오름차순)를 반환
Redis 클라이언트
- 대표적인 클라이언트로 Redisson, Lettuce, Jedis 등이 있음
- 자바에서는 Jedis가 표준 레디스 클라이언트로 사용됨
- redisson은 의외로 언급이 적음. 사용상의 번거로움이 있는 것으로 파악
- Jedis, Lettuce는 바로 메소드를 사용할 수 있지만, Redisson은 자료구조에 맞는 메소드를 선택하여야 함
- Redis 명령과 Redisson의 메소드 이름이 상이함
- value에 추가 문자가 들어감(“value” → “\”value\””)
- 레디슨은 분산 락의 구현에서 주로 사용되는 것으로 추정
- Spring Boot에서는 lettuce를 기본으로 사용함(Jedis는 스프링부트 2.0에서 마이그레이션 권장)
- Lettuce의 성능이 Jedis보다 뛰어난 것으로 파악됨
- 현 시점에서 Lettuce >= Jedis >> Redisson 정도의 순위로 Hot 하다고 할 수 있음
redis-cli : 명령줄(command line) 모드
터미널에서의 출력과 그 외의 출력의 차이
- redis-cli는 터미널 또는 tty 환경에서는 추가 정보를 제공한다.
- ex) redis-cli INCR key => (integer) 2
- 하지만, 터미널 또는 tty를 제외한 다른 모든 출력의 경우에는 “raw output mode”로 출력한다.
- redis-cli INCR key > example.txt => 2
- 터미널 환경에서 raw output mode로 출력하고 싶다면, --raw 옵션을 추가하면 된다.
- redis-cli --raw INCR key => 2
파일을 입력으로 사용하여 명령어 실행
- 리다이렉션을 사용하여 파일의 명령어 모음을 실행시킬 수 있음
- commands.txt에 여러 명령어가 저장되어 있다고 가정
- ex) cat commands.txt | redis-cli
동일한 명령 반복 실행
- redis-cli -r [횟수] -i [반복 시간 간격] [명령어]
- 반복 시간을 지정하지 않으면 0으로 지정되어 최대한 빨리 실행됨
redis-cli : 대화형 모드(Interactive mode)
- 명령줄 모드 : redis-cli에 인자를 추가하여 명령줄에서 실행하는 모드
- ex) redis-cli set key1 value1
- 대화형 모드 : redis-cli를 실행하여 레디스 서버 포트에 붙은 상태로 실행하는 모드
- ex) redis-cli (레디스 서버에 접속)
- 127.0.0.1:6379> PING => PONG
CONNECT [hostname] [port]
SELECT [index]
- index 번호에 해당하는 데이터베이스로 지정