#01. Redis 소개
1. Redis란?
Redis(Remote Dictionary Server)는 메모리 기반의 키-값 데이터 구조 저장소입니다. 데이터베이스, 캐시, 메시지 브로커로 사용되며, 다양한 데이터 구조를 지원하여 높은 성능을 제공합니다.
2. Redis의 특징
- 인메모리 저장: 모든 데이터를 메모리에 저장하여 빠른 액세스
- 다양한 데이터 구조: String, Hash, List, Set, Sorted Set 등
- 지속성: 디스크에 데이터 저장 옵션 제공
- 복제: 마스터-슬레이브 복제 지원
- 클러스터링: 수평적 확장 지원
- Pub/Sub: 메시지 발행/구독 패턴 지원
- 트랜잭션: 원자적 연산 지원
3. Redis 사용 사례
- 캐싱: 웹 애플리케이션의 캐시 레이어
- 세션 저장소: 분산 환경에서의 세션 관리
- 실시간 순위: 게임 리더보드, 인기 상품 순위
- 메시지 큐: 비동기 작업 처리
- 카운터: 조회수, 좋아요 수 등 실시간 카운팅
- 실시간 분석: 실시간 데이터 분석 및 통계
#02. Redis 설치
1. Ubuntu 설치
1
2
3
4
5
6
7
8
9
10
11
12
| # 패키지 목록 업데이트
sudo apt update
# Redis 설치
sudo apt install redis-server
# Redis 서비스 시작
sudo systemctl start redis-server
sudo systemctl enable redis-server
# 설치 확인
redis-cli ping
|
2. CentOS/RHEL 설치
1
2
3
4
5
6
7
8
9
| # EPEL 저장소 활성화
sudo yum install epel-release
# Redis 설치
sudo yum install redis
# Redis 서비스 시작
sudo systemctl start redis
sudo systemctl enable redis
|
3. Windows 설치
1
2
3
4
| # Chocolatey 사용
choco install redis-64
# 또는 WSL2에서 Ubuntu 방식으로 설치
|
4. macOS 설치
1
2
3
4
5
6
7
8
| # Homebrew 사용
brew install redis
# 서비스 시작
brew services start redis
# 백그라운드 실행
redis-server --daemonize yes
|
5. Docker로 설치
1
2
3
4
5
6
7
| # Redis 컨테이너 실행
docker run --name redis -d -p 6379:6379 redis:latest
# 영구 저장소와 함께 실행
docker run --name redis -d -p 6379:6379 \
-v redis-data:/data \
redis:latest redis-server --appendonly yes
|
#03. Redis CLI 기본 사용법
1. Redis CLI 접속
1
2
3
4
5
6
7
8
9
10
11
| # 로컬 접속
redis-cli
# 특정 호스트/포트 접속
redis-cli -h hostname -p port
# 비밀번호 인증
redis-cli -a password
# 특정 데이터베이스 선택
redis-cli -n database_number
|
2. 기본 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 연결 테스트
PING
# 서버 정보
INFO
# 모든 키 조회 (주의: 운영환경에서는 사용 금지)
KEYS *
# 패턴으로 키 검색
KEYS user:*
# 데이터베이스 선택 (0-15, 기본값: 0)
SELECT 1
# 현재 데이터베이스의 모든 키 삭제
FLUSHDB
# 모든 데이터베이스의 키 삭제
FLUSHALL
# 종료
QUIT
|
#04. String 데이터 타입
1. 기본 String 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| # 값 설정
SET key value
SET user:1000:name "김철수"
# 값 조회
GET user:1000:name
# 여러 값 동시 설정
MSET user:1000:name "김철수" user:1000:age "30"
# 여러 값 동시 조회
MGET user:1000:name user:1000:age
# 키 존재 여부 확인
EXISTS user:1000:name
# 키 삭제
DEL user:1000:name
# 만료 시간 설정 (초)
EXPIRE user:1000:session 3600
SETEX user:1000:session 3600 "session_data"
# 만료 시간 설정 (밀리초)
PEXPIRE user:1000:temp 5000
PSETEX user:1000:temp 5000 "temp_data"
# 남은 만료 시간 확인
TTL user:1000:session
PTTL user:1000:temp
|
2. 숫자 연산
1
2
3
4
5
6
7
8
9
10
11
12
| # 숫자 증가
SET counter 100
INCR counter # 101
INCRBY counter 5 # 106
# 숫자 감소
DECR counter # 105
DECRBY counter 3 # 102
# 부동소수점 연산
SET price 10.50
INCRBYFLOAT price 2.25 # 12.75
|
3. 문자열 연산
1
2
3
4
5
6
7
8
9
10
11
12
| # 문자열 뒤에 추가
SET msg "Hello"
APPEND msg " World" # "Hello World"
# 문자열 길이
STRLEN msg # 11
# 부분 문자열 조회
GETRANGE msg 0 4 # "Hello"
# 부분 문자열 변경
SETRANGE msg 6 "Redis" # "Hello Redis"
|
#05. Hash 데이터 타입
1. Hash 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| # 해시 필드 설정
HSET user:1000 name "김철수" age 30 city "서울"
# 해시 필드 조회
HGET user:1000 name
# 여러 필드 동시 조회
HMGET user:1000 name age city
# 모든 필드와 값 조회
HGETALL user:1000
# 모든 필드 이름 조회
HKEYS user:1000
# 모든 값 조회
HVALS user:1000
# 필드 존재 여부 확인
HEXISTS user:1000 email
# 필드 삭제
HDEL user:1000 city
# 필드 개수
HLEN user:1000
# 숫자 필드 증가
HINCRBY user:1000 age 1
HINCRBYFLOAT user:1000 score 1.5
|
#06. List 데이터 타입
1. List 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| # 리스트 왼쪽에 추가
LPUSH mylist "first" "second"
# 리스트 오른쪽에 추가
RPUSH mylist "third" "fourth"
# 리스트 왼쪽에서 제거 및 반환
LPOP mylist
# 리스트 오른쪽에서 제거 및 반환
RPOP mylist
# 인덱스로 요소 조회
LINDEX mylist 0
# 범위로 요소 조회
LRANGE mylist 0 -1 # 모든 요소
LRANGE mylist 0 2 # 처음 3개 요소
# 리스트 길이
LLEN mylist
# 인덱스로 값 설정
LSET mylist 0 "new_value"
# 값으로 요소 제거
LREM mylist 1 "value_to_remove" # 앞에서부터 1개 제거
LREM mylist -1 "value_to_remove" # 뒤에서부터 1개 제거
LREM mylist 0 "value_to_remove" # 모든 해당 값 제거
|
2. 블로킹 연산
1
2
3
4
5
6
7
| # 블로킹 팝 (데이터가 있을 때까지 대기)
BLPOP mylist 10 # 10초 타임아웃
BRPOP mylist 0 # 무한 대기
# 리스트 간 이동
RPOPLPUSH source_list dest_list
BRPOPLPUSH source_list dest_list 10
|
#07. Set 데이터 타입
1. Set 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # 셋에 멤버 추가
SADD myset "apple" "banana" "orange"
# 셋의 모든 멤버 조회
SMEMBERS myset
# 멤버 존재 여부 확인
SISMEMBER myset "apple"
# 멤버 제거
SREM myset "banana"
# 셋 크기
SCARD myset
# 랜덤 멤버 조회
SRANDMEMBER myset
SRANDMEMBER myset 2 # 2개 랜덤 조회
# 랜덤 멤버 제거 및 반환
SPOP myset
|
2. Set 집합 연산
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 두 셋 생성
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"
# 교집합
SINTER set1 set2
# 합집합
SUNION set1 set2
# 차집합
SDIFF set1 set2
# 교집합을 새 셋에 저장
SINTERSTORE result set1 set2
# 멤버를 다른 셋으로 이동
SMOVE set1 set2 "a"
|
#08. Sorted Set 데이터 타입
1. Sorted Set 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| # 정렬된 셋에 멤버 추가 (스코어와 함께)
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"
# 스코어로 범위 조회 (오름차순)
ZRANGE leaderboard 0 -1
ZRANGE leaderboard 0 -1 WITHSCORES
# 스코어로 범위 조회 (내림차순)
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 스코어 범위로 조회
ZRANGEBYSCORE leaderboard 100 200
# 멤버의 스코어 조회
ZSCORE leaderboard "player1"
# 멤버의 순위 조회
ZRANK leaderboard "player1" # 오름차순 순위
ZREVRANK leaderboard "player1" # 내림차순 순위
# 스코어 증가
ZINCRBY leaderboard 50 "player1"
# 멤버 제거
ZREM leaderboard "player2"
# 순위로 멤버 제거
ZREMRANGEBYRANK leaderboard 0 0 # 최하위 제거
# 스코어로 멤버 제거
ZREMRANGEBYSCORE leaderboard 0 100
# 정렬된 셋 크기
ZCARD leaderboard
# 스코어 범위의 멤버 수
ZCOUNT leaderboard 100 200
|
#09. 트랜잭션
1. 기본 트랜잭션
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 트랜잭션 시작
MULTI
# 명령어들 추가 (즉시 실행되지 않음)
SET key1 "value1"
SET key2 "value2"
INCR counter
# 트랜잭션 실행
EXEC
# 트랜잭션 취소
DISCARD
|
2. 조건부 트랜잭션 (Optimistic Locking)
1
2
3
4
5
6
7
8
9
10
| # 키 감시
WATCH counter
# 트랜잭션 시작
MULTI
SET counter 100
EXEC
# 감시 해제
UNWATCH
|
#10. Pub/Sub (발행/구독)
1. 기본 Pub/Sub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 채널 구독 (구독자)
SUBSCRIBE news sports
# 패턴으로 구독
PSUBSCRIBE news:*
# 메시지 발행 (발행자)
PUBLISH news "Breaking news!"
PUBLISH sports "Game result"
# 구독 해제
UNSUBSCRIBE news
PUNSUBSCRIBE news:*
# 활성 채널 조회
PUBSUB CHANNELS
PUBSUB CHANNELS news:*
# 구독자 수 조회
PUBSUB NUMSUB news sports
|
#11. 스크립팅 (Lua)
1. Lua 스크립트 실행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 간단한 스크립트
EVAL "return redis.call('set', KEYS[1], ARGV[1])" 1 mykey myvalue
# 복잡한 스크립트
EVAL "
local counter = redis.call('get', KEYS[1])
if counter == false then
counter = 0
end
counter = counter + ARGV[1]
redis.call('set', KEYS[1], counter)
return counter
" 1 mycounter 10
# 스크립트 캐싱
SCRIPT LOAD "return redis.call('get', KEYS[1])"
# 반환된 SHA1 해시 사용
EVALSHA 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 1 mykey
|
#12. 지속성 설정
1. RDB (스냅샷)
1
2
3
4
5
6
7
8
9
10
| # 즉시 스냅샷 생성
BGSAVE
# 마지막 저장 시간 확인
LASTSAVE
# redis.conf 설정
save 900 1 # 900초 동안 1개 이상 변경시 저장
save 300 10 # 300초 동안 10개 이상 변경시 저장
save 60 10000 # 60초 동안 10000개 이상 변경시 저장
|
2. AOF (Append Only File)
1
2
3
4
5
6
7
8
| # AOF 재작성
BGREWRITEAOF
# redis.conf 설정
appendonly yes
appendfsync everysec # 매초 동기화
# appendfsync always # 매 쓰기마다 동기화
# appendfsync no # OS에 맡김
|
#13. 성능 모니터링
1. 모니터링 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # 실시간 명령어 모니터링
MONITOR
# 서버 통계 정보
INFO
INFO stats
INFO memory
INFO clients
# 느린 쿼리 로그
SLOWLOG GET 10
SLOWLOG LEN
SLOWLOG RESET
# 메모리 사용량 분석
MEMORY USAGE mykey
MEMORY STATS
# 클라이언트 연결 정보
CLIENT LIST
CLIENT INFO
|
2. 벤치마킹
1
2
3
4
5
6
7
8
| # Redis 벤치마크 실행
redis-benchmark -h localhost -p 6379 -c 50 -n 10000
# 특정 명령어 벤치마크
redis-benchmark -h localhost -p 6379 -t get,set -n 100000
# 파이프라인 벤치마크
redis-benchmark -h localhost -p 6379 -P 16 -q
|
#14. 보안 설정
1. 인증 설정
1
2
3
4
5
6
7
8
| # redis.conf에서 비밀번호 설정
requirepass your_password
# 런타임에서 비밀번호 설정
CONFIG SET requirepass your_password
# 인증
AUTH your_password
|
2. 네트워크 보안
1
2
3
4
5
6
7
8
9
10
| # redis.conf에서 바인딩 설정
bind 127.0.0.1 192.168.1.100
# 보호 모드 활성화
protected-mode yes
# 특정 명령어 비활성화
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG SECRET_CONFIG_NAME
|
#15. 실제 사용 예시
1. 캐싱 예시
1
2
3
4
5
6
7
| # 사용자 정보 캐싱
SET user:1000 "{\"name\":\"김철수\",\"age\":30,\"city\":\"서울\"}"
EXPIRE user:1000 3600
# 페이지 캐싱
SET page:/products/1 "<html>...</html>"
EXPIRE page:/products/1 1800
|
2. 세션 관리
1
2
3
4
5
6
7
8
9
| # 세션 저장
HSET session:abc123 user_id 1000 username "kimcs" login_time "2024-12-04 10:00:00"
EXPIRE session:abc123 7200
# 세션 조회
HGETALL session:abc123
# 세션 연장
EXPIRE session:abc123 7200
|
3. 실시간 카운터
1
2
3
4
5
6
7
8
| # 페이지 조회수
INCR page:views:/products/1
# 좋아요 수
INCR post:likes:100
# 일별 방문자 수
INCR stats:visitors:2024-12-04
|
4. 순위표
1
2
3
4
5
6
7
8
| # 게임 점수 추가
ZADD game:leaderboard 1500 "player1" 1200 "player2" 1800 "player3"
# 상위 10명 조회
ZREVRANGE game:leaderboard 0 9 WITHSCORES
# 특정 플레이어 순위
ZREVRANK game:leaderboard "player1"
|
#16. 마무리
Redis는 높은 성능과 다양한 데이터 구조를 제공하는 강력한 인메모리 데이터베이스입니다. 캐싱, 세션 관리, 실시간 데이터 처리 등 다양한 용도로 활용할 수 있으며, 적절한 데이터 구조를 선택하여 사용하면 애플리케이션의 성능을 크게 향상시킬 수 있습니다.
특히 메모리 기반의 빠른 읽기/쓰기 성능과 원자적 연산 지원으로 동시성이 중요한 환경에서 매우 유용합니다.