Study/Redis

[Redis] Redis의 기초와 명령어

black6765 2022. 11. 8. 16:35

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 *와 같이 전체 키를 조회할 수 있으나 권장되지 않음
    • scan 1을 사용하는 것이 효율적임

type [key]

  • 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를 추가하여도 같은 효과
    • ex) set key1 value1 nx

get [key]

  • key에 해당하는 value를 리턴

mget [key1] [key2…]

  • 여러 개의 key를 리턴

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]

  • 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]

  • key에 대한 멤버를 제거(remove)

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 번호에 해당하는 데이터베이스로 지정