Redis Sentinel

  • Redis의 인스턴스는 Master와 Slave로 구성됨
    • Master는 원본
    • Slave는 Master(원본)에 대한 복제본
  • Master에 문제가 발생하면 Slave를 Master로 승격시켜 사용 : Failover
  • Sentinel은 Failover를 자동으로 해주는 기능
    • Master와 Slave를 감시하고, Master에 문제가 발생했을 때 Slave 중 적절한 노드를 선택
    • 해당 노드를 Master로 승격시킴
    • 이 때 Sentinel 간의 투표 과정에서 과반수를 초과하여 득표를 얻은 노드를 승격시킴
    • 이러한 이유로 Sentinel 인스턴스는 3개 이상의 홀 수로 구성되어야 함

Sentinel Configuration

Step 1. sentinel.conf 파일 복사

  • redis의 홈 디렉토리에 sentinel.conf 파일이 존재함
    • 이제부터 redis 홈 디렉토리를 $REDIS_HOME으로 표기
  • $REDIS_HOME/sentinel.conf 파일을 포트 번호를 구분한 파일명으로 복사
    • ex) $REDIS_HOME/sentinel_26379.conf
    • 해당 설정 파일에 대한 설정을 마친 후, 센티널 노드 개수만큼 복사하여 사용

 

Step 2. 복사한 conf 파일 설정

  • vim 또는 다른 파일 편집기를 이용해 아래의 설정을 적절하게 변경
    • port <변경할 포트 번호>
    • sentinel monitor mymaster 127.0.0.1 <마스터 노드>
      • 여기서 quorum은 failover 시에 몇 개 이상의 센티널 노드가 찬성해야 하는지에 대한 값
      • ex) 센티널 노드가 3개일 때 해당 값을 2로 설정하면 2개 이상의 센티널 노드가 failover에 찬성해야 failover가 실행됨
    • pidfile /var/run/redis-sentinel_”포트 번호”.pid
    • logfile /var/log/sentinel_”포트 번호”.log
    • sentinel auth-pass <마스터 이름> <패스워드>
      • 마스터 노드는 패스워드를 가져야 함
      • 센티널에 의해 슬레이브 노드 또한 마스터로 승격될 수 있으므로 슬레이브 노드에도 모두 설정
      • 해당 설정을 하게 되면 redis-cli로 접속 시 auth 명령을 이용해 인증이 필요
  • 아래는 디폴트가 설정되어 있어서 변경하지 않아도 되는 설정들
    • sentinel down-after-milliseconds mymaster “타임아웃 시간”
      • 마스터에 문제가 생겼을 시 해당 시간(단위: ms) 이후에 failover을 실행
    • sentinel failover-timeout mymaster “타임아웃 시간”
      • failover 작업에 대한 타임아웃(단위: ms)
    • sentinel parallel-syncs mymaster “slave 노드 개수”
      • 마스터로 동기화하는 slave 노드 개수

 

Step 3. conf 파일을 센티널 개수 만큼 복사 및 포트에 맞게 설정

  • 방금 수정한 $REDIS_HOME/sentinel_”포트 번호”.conf 파일을 센티널 개수 만큼 복사
  • 그리고 포트 번호에 따라 파일 내용 수정 및 파일명 수정
  • vim을 사용할 경우 :%s/”대상 문자열”/”변경할 문자열”로 바꾸면 빠르게 수행 가능

 

Step 4. Slave 노드 설정

  • slave 노드가 마스터 노드로 변경될 가능성이 있기 떄문에 slave 노드에 패스워드를 설정해야 함
  • /etc/redis/”슬레이브의 포트 번호”.conf 파일의 임의의 위치에 다음 문구를 추가
    • masterauth “설정한 패스워드”
    • requirepass “설정한 패스워드”
    • slaveof 127.0.0.1 “마스터의 포트 번호”
    • slave-read-only yes
    • 위에서 slave를 replica로 변경 할 수 있음
      • ex) replicaof 127.0.0.1 “마스터의 포트 번호”
  • master 노드로 접속하여 info 실행 시 아래와 같이 slave 노드의 정보가 출력되어야 함
  • # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=600999,lag=1 slave1:ip=127.0.0.1,port=6380,state=online,offset=601132,lag=0

 

Step 5. Sentinel 실행

  • sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호”.conf를 실행하여 모든 센티넬을 실행시킨다.
  • 전체 센티넬을 백그라운드로 실행하기 위해서는 다음과 같이 입력한다.
    • sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호1”.conf & sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호2”.conf & sudo redis-sentinel $REDIS_HOME/sentinel_”포트 번호3”.conf &
    • 센티넬은 다른 노드와 같이 redis-cli 명령어를 통해 접속할 수 있다.
      • ex) redis-cli -p 26379 → shutdown

Sentinel Failover 테스트

Step 1. 각 노드 기동 중지 및 실행 방법

  • 노드 중지
    • redis-cli로 중지할 노드 접속 → shutdown
    • auth 설정이 되어 있다면 auth → 패스워드 입력 후 shutdown
  • 노드 실행
    • sudo redis-server /etc/redis/”포트 번호”.conf
      • 설정 파일 이름은 다르게 설정했을 경우 다를 수 있음
      • redis-server “설정파일”과 같이 실행

 

Step 2. tail -f 명령어로 로깅

  • failover를 확인하기 위해서는 Slave 노드의 로그를 확인해야 함
  • 이때 tail -f /var/log/redis_”포트 번호”.log 명령어를 이용하면 로그를 추적할 수 있음
  • 마스터 노드를 기동 중지하기 전에 위의 명령어를 통해 로깅을 시작

 

Step 3. 마스터 노드 기동 중지

  • Step 1.을 참고하여 redis-cli로 마스터 노드에 접속하여 shutdown
  • 로깅을 하고 있다면, connection 관련 로그들이 출력되고 설정한 timeout 시간이 지나면 새로운 노드가 마스터가 됨
  • 기존의 마스터 노드를 다시 실행시켜 info를 확인해보면 아래와 같이 되어 있는 것을 확인 가능
# Replication
role:slave
master_host:127.0.0.1
master_port:"마스터 노드의 포트 번호"
  • 이와 같이 동작 했다면, failover 기능이 정상적으로 작동한 것임
  • failover 기능이 작동하면 하나의 노드는 master가 되고, 그 나머지 노드는 master가 된 node를 바라보게 됨(/etc/redis/”포트 번호”.conf에서 설정이 변경되어 있음)
    • 마스터로 승격한 노드는 슬레이브 관련 설정이 삭제됨
    • 또한 최신 버전에서 slave 관련 설정은 replica로 치환되어 설정됨

 

참고자료

https://syhwang.tistory.com/47

https://d2fault.github.io/2019/01/24/20190124-install-redis-and-set-master-slave-relationship/

'Study > Redis' 카테고리의 다른 글

[Redis] Redis Cluster  (0) 2022.11.15
[Redis] Redis의 기초와 명령어  (0) 2022.11.08

클러스터 관련 명령

  • 클러스터 관련 명령은 redis-cli --cluster [명령]과 같은 형식으로 하게 된다.
  • 클러스터에 접속하기 위해 IP:PORT 정보를 입력받는데, 입력한 IP:PORT에 해당하는 노드에게만 영향을 주는 것이 아닌, 그 노드에 접속해서 클러스터에 영향을 주는 것이라고 생각하면 된다.
    • ex) redis-cli --cluster del-node [IP:PORT] [노드 ID]
      • 이 명령어는 IP:PORT에 해당하는 노드를 삭제하는 것이 아닌, 노드 ID에 해당하는 노드를 삭제함
      • 즉, IP:PORT는 클러스터에 접속하기 위한 정보
    • redis-cli --cluster info [IP:PORT]와 같은 명령어도 해당하는 노드 뿐만 아니라 연결되어 있는 클러스터의 모든 정보를 가져오게 됨

 

info

  • redis-cli --cluster info [IP:PORT]
  • 클러스터의 정보를 확인한다.

 

reshard

  • redis-cli --cluster reshard [IP:PORT]
  • 슬롯을 재할당 한다.
  • 명령을 입력하면 옮길 slot의 개수, slot을 받을(receive) node의 ID, slot을 가져올 node(source node)의 ID(여러 개 입력 가능)를 입력받는다.
    • 가져올 노드의 ID를 “all”로 설정하면 모든 노드에서 일정 부분을 reshard 한다.

 

add-node

  • redis-cli --cluster add-node [새로 등록할 노드의 IP:PORT] [기존의 노드 IP:PORT]
    • 새로운 노드를 마스터로 클러스터에 등록함
  • redis-cli --cluster add-node [새로 등록할 노드의 IP:PORT] [기존의 노드 IP:PORT] –cluser-slave
    • 새로운 노드를 기존의 노드의 슬레이브로 등록함

 

del-node

  • redis-cli --cluster del-node [IP:PORT] [노드 ID]
    • 노드 ID에 해당하는 노드를 클러스터에서 삭제
    • 마스터 노드라면 해당 노드에 슬롯이 존재하지 않는 상태일 때 삭제 가능
      • reshard 명령을 통해 슬롯을 비워 놓아야 함
    • 슬레이브 노드는 바로 삭제 가능

 


Redis Cluster 환경 설정 - install_server.sh

Step 1.

  • Redis를 설치 후 “utils” 디렉토리로 이동하여 install_server.sh를 실행
  • 이때 systemd를 사용하는 경우 아래와 같은 문구가 출력되며 종료됨
This systems seems to use systemd.
Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!
  • 이 경우 해당 부분을 변경해야 함
#bail if this system is managed by systemd
_pid_1_exe="$(readlink -f /proc/1/exe)"
if [ "${_pid_1_exe##*/}" = systemd ]
then
        echo "This systems seems to use systemd."
        echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
        exit 1
fi
  • 이 부분을 모두 주석처리 하면 정상 실행됨

 

Step 2. install_server.sh에서의 설정

  • 스크립트를 실행시키면 여러 설정을 하게 된다.
  • Please select the redis port for this instance: [6379] 6500
    • 기본 포트는 6379로 설정되어 있고, 다른 포트를 입력 시 그 포트로 사용할 수 있음
    • 여기서는 “6500”으로 설정
  • Please select the redis config file name [/etc/redis/6500.conf]
    • 설정 파일의 이름과 위치를 설정함
    • 기본 이름은 “포트번호”.conf
  • Please select the redis log file name [/var/log/redis_6500.log]
    • 로그 파일의 이름과 위치를 설정함
    • 기본 이름은 redis_“포트번호”.log
  • Please select the data directory for this instance [/var/lib/redis/6500]
    • 데이터가 저장될 이름과 위치를 설정함
    • 기본 이름은 “포트번호”
  • Please select the redis executable path []
    • redis를 실행시킬 위치를 설정함
    • /usr/local/bin/”실행 명령어”로 두면 어느 위치에서나 “실행 명령어”를 통해 해당 인스턴스를 실행시킬 수 있음
    • 보통 “/usr/local/bin/redis-server”로 설정

 

Step 3. 클러스터링 할 인스턴스 설정

  • Step 2.의 과정을 반복하여 클러스터링 할 다수의 인스턴스를 생성한다.
    • 여기서는 6500, 6501, 6502 포트를 사용하여 클러스터링 설정
  • 그 후 /etc/redis/"포트번호".conf 파일의 설정을 다음과 같이 변경한다.
    • appendonly no → appendonly yes
      • 위의 세 개의 설정은 비슷한 위치에 모여있지만, appendonly는 조금 떨어져 있음
# cluster-enabled yes → cluster-enabled yes
# cluster-config-file nodes-6379.conf → cluster-config-file nodes.conf
# cluster-node-timeout 15000 → cluster-node-timeout 15000
  • 클러스터를 구성할 모든 포트 번호를 위와 같이 설정한다.
  • sudo service redis_”포트번호” restart 명령어로 재시작 시켜준다.
    • 이 과정을 실행하지 않으면 클러스터 생성 시 아래와 같은 문구가 출력되며 실패할 수 있음
      • [ERR] Node 127.0.0.1:6500 is not configured as a cluster node.

 

Step 4. 라이브러리 설치

  • Redis cluster 명령어를 사용하기 위해 다음과 같은 라이브러리를 설치한다.
    • ruby, ruby-devel, rubygems, rpm-build
    • sudo apt install ruby rubygems
    • gem install redis
    • 설치하지 않아도 문제 없이 클러스터 명령어가 사용된다면, 해당 부분은 넘어간다. (리눅스 환경에 따라 설치)

 

Step 5. 클러스터 생성

  • redis-cli --cluster create 127.0.0.1:6500 127.0.0.1:6501 127.0.0.1:6502
    • yes를 타이핑하면 클러스터링 완료
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 47741c09d75d72728b623554801aa98568b9dbdc 127.0.0.1:6500
   slots:[0-5460] (5461 slots) master
M: 59a9214e94f69a7b106478009c1332b3d1fc6394 127.0.0.1:6501
   slots:[5461-10922] (5462 slots) master
M: 27eb7dd5a54199a88ab0e3cb56fe663199ea75ed 127.0.0.1:6502
   slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept):
  • Redis 설정 정보의 위치는 아래와 같이 구성됨
    • 시작 및 종료 스크립트
      • /etc/init.d/redis_"포트번호"
    • 설정 파일 위치
      • /etc/redis/"포트번호".conf
    • dump 파일, nodes.conf 파일 위치
      • /var/lib/redis/"포트번호"
    • 로그 파일 위치
      • /var/log/redis_"포트번호".log

create-cluster utils를 이용하여 클러스터 설치

  • utils/create-cluster에 클러스터를 빠르게 설치할 수 있도록 하는 도구가 존재한다.

Step 1. create-cluster Settings 수정

  • 해당 파일에서 아래 부분을 수정한다
# Settings
BIN_PATH="$SCRIPT_DIR/../../src/"
CLUSTER_HOST=127.0.0.1
PORT=30000
TIMEOUT=2000
NODES=6
REPLICAS=1
PROTECTED_MODE=yes
ADDITIONAL_OPTIONS=""
  • 위는 기본 설정으로, 이대로 진행 시 6개의 노드를 생성하게 된다.
  • REPLICAS는 각 노드 당 몇 개의 레플리카를 형성할 것인지 설정한다.
    • 6개의 노드에서 1로 설정되어 있을 때 3개는 마스터, 3개는 슬레이브로 설정된다.
    • 만약 6개의 노드에서 2로 설정되어 있다면, 각 노드 당 슬레이브가 2개로 설정되므로 마스터 2, 슬레이브 4로 구성된다
      • Redis Cluster는 최소 3개의 마스터가 필요하기 때문에 유효하지 않은 설정으로 에러가 발생한다
*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 6 nodes and 2 replicas per node.
*** At least 9 nodes are required.

 

Step 2. create-cluster start

  • ./create-cluster start 명령을 통해 생성을 시작한다.
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
  • ps -ef | grep redis로 확인 시 방금 생성한(또는 실행 중인) Redis 인스턴스가 출력된다.

 

Step 3. create-cluster create

  • create 명령을 이용해 클러스터를 생성한다.
  • 위와 같은 기본 설정으로 실행 시 최종적으로 아래와 같은 로그가 출력된다.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 9d51a810038c84ab71428863bfaf453a18067109 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: 631007283d9b65dd20f55a099fa566952837e9a5 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: 322740e3a1b1b858b1258bd4e8b793fa7f578583 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: ac21998d354ae6fa3204647f0b500bec6a15a137 127.0.0.1:30004
   replicates 9d51a810038c84ab71428863bfaf453a18067109
S: 48f533c9867185605b15c1fff274282d073f6fe9 127.0.0.1:30005
   replicates 631007283d9b65dd20f55a099fa566952837e9a5
S: 5895b8d9b992eba2faf9aad5ab8364d6429d6e31 127.0.0.1:30006
   replicates 322740e3a1b1b858b1258bd4e8b793fa7f578583
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 9d51a810038c84ab71428863bfaf453a18067109 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 48f533c9867185605b15c1fff274282d073f6fe9 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 631007283d9b65dd20f55a099fa566952837e9a5
M: 631007283d9b65dd20f55a099fa566952837e9a5 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 5895b8d9b992eba2faf9aad5ab8364d6429d6e31 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 322740e3a1b1b858b1258bd4e8b793fa7f578583
M: 322740e3a1b1b858b1258bd4e8b793fa7f578583 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: ac21998d354ae6fa3204647f0b500bec6a15a137 127.0.0.1:30004
   slots: (0 slots) slave
   replicates 9d51a810038c84ab71428863bfaf453a18067109
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  • 총 6개의 노드에 3개의 마스터와 3개의 슬레이브로 구성된 클러스터 환경이 구성되었다.
  • 포트는 30000으로 지정했을 때 30001 ~ 30006으로 구성되었다.
  • 30001, 30002, 30003은 마스터, 나머지는 슬레이브로 구성된다.

 

Append. create-cluster의 여러 명령어

  • clean
    • create_cluster를 이용해 만들어진 클러스터는 utils/create-cluster 디렉토리에 설정파일이 존재한다.
    • /create-cluster clean 명령은 이러한 설정 파일들을 삭제하여 초기화 한다.
  • stop
    • 모든 클러스터를 정지시킨다.
  • start
    • 앞서 사용한 명령어로, 모든 클러스터를 시작한다.
  • 그 외
Usage: ./create-cluster [start|create|stop|watch|tail|tailall|clean|clean-logs|call]
start       -- Launch Redis Cluster instances.
create [-f] -- Create a cluster using redis-cli --cluster create.
stop        -- Stop Redis Cluster instances.
watch       -- Show CLUSTER NODES output (first 30 lines) of first node.
tail <id>   -- Run tail -f of instance at base port + ID.
tailall     -- Run tail -f for all the log files at once.
clean       -- Remove all instances data, logs, configs.
clean-logs  -- Remove just instances logs.
call <cmd>  -- Call a command (up to 7 arguments) on all n

참고 자료

'Study > Redis' 카테고리의 다른 글

[Redis] Redis Sentinel  (0) 2022.11.21
[Redis] Redis의 기초와 명령어  (0) 2022.11.08

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

'Study > Redis' 카테고리의 다른 글

[Redis] Redis Sentinel  (0) 2022.11.21
[Redis] Redis Cluster  (0) 2022.11.15

+ Recent posts