Post

Redis 기초 사용법

인메모리 데이터 구조 저장소인 Redis의 설치부터 기본 사용법까지 알아봅니다. 캐싱, 세션 관리, 실시간 데이터 처리에 활용되는 Redis의 다양한 기능을 소개합니다.

Redis 기초 사용법

#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는 높은 성능과 다양한 데이터 구조를 제공하는 강력한 인메모리 데이터베이스입니다. 캐싱, 세션 관리, 실시간 데이터 처리 등 다양한 용도로 활용할 수 있으며, 적절한 데이터 구조를 선택하여 사용하면 애플리케이션의 성능을 크게 향상시킬 수 있습니다.

특히 메모리 기반의 빠른 읽기/쓰기 성능과 원자적 연산 지원으로 동시성이 중요한 환경에서 매우 유용합니다.

This post is licensed under CC BY 4.0 by the author.