관련글
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과의 연동까지 살펴보겠습니다.
- Redis(Standalone)
- Redis Master / Slave
- Redis Master / Slave Cluster
- 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를 사용할 수 있습니다.
- Windows package mansger Chocolatey 를 사용하여 redis 설치
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 구성에 대해 살펴보겠습니다.
'DataBase' 카테고리의 다른 글
[Oracle] 오라클 단일, 다중 With절 사용방법과 유스케이스 (0) | 2023.07.07 |
---|---|
2. Redis, Sentinel 고가용성을 위한 마스터/슬레이브 구성! (0) | 2023.05.26 |
PostgreSQL 날짜 API 다루기( 두 날짜 사이 시간 계산, extract, age 등 ) (0) | 2023.02.09 |
PostgreSQL 캐스팅 사용 방법 유용한 예제(숫자, 문자, 날짜 변환) (0) | 2023.02.07 |
PostgreSQL 테이블 CRUD 쿼리 예제 (1) | 2023.02.06 |