본문 바로가기
DataBase

1. Redis란? Docker 설치 및 cli 명령어 알아보기

by 맑은안개 2023. 4. 17.

관련글

2023.05.26 - [DB] - 2. Redis, Sentinel 고가용성을 위한 마스터/슬레이브 구성!

Redis란?

Redis는 In-Memory 데이터 저장소로서, 키-값 기반의 데이터 구조를 지원하는 오픈 소스 데이터베이스입니다. Redis는 RAM에 데이터를 저장하므로, 데이터 접근 속도가 매우 빠릅니다. Redis는 간단하면서도 높은 성능을 보장하며, 캐싱, 세션 관리, 메시지 브로커 등 다양한 용도로 사용됩니다.

탄생 배경

Redis가 만들어진 이유는, 기존의 RDBMS에서 발생하는 I/O 병목현상을 해결하고, 빠른 데이터 처리 속도를 보장하기 위해서입니다. RDBMS는 디스크에 데이터를 저장하므로, 데이터 접근 속도가 느릴 수밖에 없습니다. 따라서, RDBMS의 단점을 보완하면서도 높은 성능을 보장하는 In-Memory 데이터베이스가 필요했습니다. 이에 대한 대안으로 Redis가 만들어졌습니다.

Redis 사용 목적

Redis의 주요 목적은 높은 처리 속도와 신뢰성을 제공하는 것입니다. Redis는 대용량 데이터 처리에 적합하며, 많은 양의 데이터를 빠르게 읽고 쓸 수 있습니다. 또한, Redis는 안정적인 데이터 보관을 위한 레플리케이션과 장애 복구를 위한 클러스터링 기능도 제공합니다. 이러한 Redis의 장점으로 인해, 다양한 분야에서 사용되고 있습니다.

살펴볼 내용

Redis는 아래와 같이 구성됩니다. Docker기반으로 빠르게 구축해보면서 Application과의 연동까지 살펴보겠습니다.

  1. Redis(Standalone)
  2. Redis Master / Slave
  3. Redis Master / Slave Cluster
  4. Spring Boot + Redis 활용

개발환경

  • Windows 11
  • WSL ( Docker 환경 구동을 위한 사전 설치 )
  • Docker Desktop

Redis Standalone 구성

Redis는 다중 노드를 구성하여 마스터 / 슬레이드, 클러스터 구축이 가능합니다. 이를 알아보기 전에 단일 노드 구성(standalone)을 먼저 살펴보겠습니다.

docker-compose-standalone.yaml

version: '3'

services:
  redis:
    container_name: redis
    image: redis:6.2-alpine
    ports:
      - "6379:6379"
$ docker-compose -f docker-compose-standalone up

[+] Running 2/2
 - Network redis_test_default  Created                                                                                                                                                                0.1s
 - Container redis             Created                                                                                                                                                                0.1s
0000, modified=0, pid=1, just started
redis  | 1:C 17 Apr 2023 01:05:52.507 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.confredis  | 1:M 17 Apr 2023 01:05:52.508 * monotonic clock: POSIX clock_gettime
redis  | 1:M 17 Apr 2023 01:05:52.512 * Running mode=standalone, port=6379.redis  | 1:M 17 Apr 2023 01:05:52.512 # Server initialized
redis  | 1:M 17 Apr 2023 01:05:52.512 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.    redis  | 1:M 17 Apr 2023 01:05:52.513 * Ready to accept connections
  • docker-compose up 명령 실행 후 redis 컨테이너 로그 확인
  • redis-cli 도구를 사용하여 정상 동작 확인
$ docker exec -it redis redis-cli ping
PONG

Host에서 Redis 접속 테스트

Host에 Redis를 설치하여 redis-cli를 사용할 수 있습니다.

Choco를 사용하여 Redis-cli 설치


$ choco install redis-64 --version=3.0.501
Chocolatey v1.3.1
Installing the following packages:
redis-64
By installing, you accept licenses for the packages.
Progress: Downloading redis-64 3.0.501... 100%

redis-64 v3.0.501 [Approved]
redis-64 package files install completed. Performing other installation steps.
 ShimGen has successfully created a shim for redis-benchmark.exe
 ShimGen has successfully created a shim for redis-check-aof.exe
 ShimGen has successfully created a shim for redis-check-dump.exe
 ShimGen has successfully created a shim for redis-cli.exe
 ShimGen has successfully created a shim for redis-server.exe
 The install of redis-64 was successful.
  Software installed to 'C:\ProgramData\chocolatey\lib\redis-64'

Chocolatey installed 1/1 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).


$ redis-cli
127.0.0.1:6379> ping
PONG
  • Host에서 redis-cli 도구를 사용하여 6379 레디스 노드에 ping 전송, pong 정상 응답 확인

redis-cli 명령어 살펴보기

1. KEY-VALUE관리 SET / GET / DEL

key-value 추가 / 조회 / 삭제

127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> GET foo
"bar"
127.0.0.1:6379> DEL foo
(integer) 1

2. 숫자관리 INCR / DECR

숫자의 증가/감소

127.0.0.1:6379> SET mynum 10
OK
127.0.0.1:6379> INCR mynum
(integer) 11
127.0.0.1:6379> INCR mynum
(integer) 12
127.0.0.1:6379> DECR mynum
(integer) 11
127.0.0.1:6379> DECR mynum
(integer) 10
127.0.0.1:6379> DECR mynum
(integer) 9

3. 리스트 객체

LPUSH VS RPUSH

LPUSH, RPUSH 를 사용하여 LIST 객체를 생성할 수 있습니다. 두 명령은 생성시 리스트 요소의 순서에 차이가 발생합니다.

127.0.0.1:6379> LPUSH l_list "a"
(integer) 1
127.0.0.1:6379> LPUSH l_list "b"
(integer) 2
127.0.0.1:6379> LPUSH l_list "c"
(integer) 3

127.0.0.1:6379> LRANGE l_list 0 -1
1) "c"
2) "b"
3) "a"

127.0.0.1:6379> RPUSH r_list "a"
(integer) 1
127.0.0.1:6379> RPUSH r_list "b"
(integer) 2
127.0.0.1:6379> RPUSH r_list "c"
(integer) 3

127.0.0.1:6379> LRANGE r_list 0 -1
1) "a"
2) "b"
3) "c"
  • LRANGE는 리스트 범위를 지정하여 요소를 조회하는 명령어로, 두 번째 인자에 -1을 주어 전체요소를 조회합니다.
  • 위의 결과처럼, LPUSH, RPUSH의 요소 인덱스에 차이가 있음을 확인 할 수 있습니다.
127.0.0.1:6379> LINDEX l_list 0
"c"
127.0.0.1:6379> LINDEX r_list 0
"a"
  • LINDEX 명령을 사용하여 지정한 인덱스 위치의 요소에 접근할 수 있습니다. ( LPUSH, RPUSH의 차이점을 확인하세요 )

리스트 관리를 위한 기타 명령어들

# 리스트 길이 반환
127.0.0.1:6379> LLEN l_list
(integer) 3

# 리스트 특정 범위 외 제거
127.0.0.1:6379> LTRIM l_list 0 1
OK
127.0.0.1:6379> LRANGE l_list 0 -1
1) "c"
2) "b"

# 특정 인덱스의 값 변경
127.0.0.1:6379> LSET l_list 0 "a"
OK
127.0.0.1:6379> LRANGE l_list 0 -1
1) "a"
2) "b"

# 특정 값의 전(BEFORE)/후(AFTER) 에 값을 삽입
127.0.0.1:6379> LINSERT l_list BEFORE "b" "betweenAandB"
(integer) 3
127.0.0.1:6379> LRANGE l_list 0 -1
1) "a"
2) "betweenAandB"
3) "b"

# LPOP / RPOP 리스트의 왼쪽, 오른쪽에서 값을 가져오고 제거
127.0.0.1:6379> LPOP l_list
"a"
127.0.0.1:6379> LRANGE l_list 0 -1
1) "betweenAandB"
2) "b"

이어서 다음 블로그에서 Master / Slaver 구성, Master / Slaver + Cluster 구성에 대해 살펴보겠습니다.

반응형