Redis 란?
- 오픈 소스 인 메모리 데이터 구조 저장소로, 주로 데이터베이스, 캐시, 메시지 브로커로 사용
- key-value 저장소의 형태를 가지며 String, List, Set, Hash 등 다양한 데이터 구조를 지원
- 데이터 복제를 통해 고가용성을 지원하며, RDB와 AOF 로그를 통해 데이터 영속성을 보장
- pub/sub 기능을 지원하여 메시지 브로커로 사용
Redis 기본 개념
In-Memory Data Store
- 데이터를 디스크 대신 주 메모리에 저장하여 데이터 접근 속도를 극대화하는 방식의 데이터 저장 시스템
• 메모리는 디스크보다 훨씬 빠르게 데이터를 읽고 쓸 수 있다.
• 빠른 데이터 접근 속도로 인해 애플리케이션의 전체 지연 시간이 줄어든다.
• 데이터 저장 크기가 메모리라서 작다.
Redis Collections
- Redis는 다양한 데이터 구조(Collections)를 지원
- 다양한 유형의 데이터를 효율적으로 저장하고 처리
Collections 주요 리스트
• Strings - 가장 기본적인 데이터 타입으로 기본 set 명령어를 사용하면 String 타입으로 저장
• Bitmaps - 문자열의 비트를 다루는 데 사용되며, 비트 단위의 연산이 가능
• Lists - 데이터를 순서대로 저장
• Sets - 유일한 값을 저장하는 무순서 집합, 중복된 값을 허용하지 않음
• Sorted Sets - 각 value가 score와 함께 저장되는 집합으로, score 기준으로 정렬, , 중복된 값을 허용하지 않음
• Hashes - 하나의 key 안에 또 다시 여러 개의 field와 value 쌍으로 데이터를 저장
• HyperLogLogs - 대략적인 중복된 원소의 수를 추정하는 데 사용. 매우 적은 메모리로 대규모 데이터의 카디널리티를 추정
• Geos - 지리적 좌표(위도, 경도)를 저장하고, 반경 내 위치 검색 등 지리 공간 쿼리를 지원
• Streams - 로그나 이벤트 데이터를 시간순으로 저장하고 처리
Single Thread & Multiplexing
- Redis는 Single Thread로 실행. 하나의 쓰레드가 모든 요청을 처리
- Event Loop를 통해 비동기적으로 다수의 클라이언트 요청을 처리
- 실제 명령에 대한 작업은 커널 I/O 레벨에서 Multiplexing을 통해 처리하여 동시성을 보장
- Redis는 Single Thread로 동작하지만 Multiplexing을 통해 여러 클라이언트 요청을 효율적으로 처리
Redis는 Multiplexing으로 요청을 동시에 처리할 수 있지만 기본적으로 Single Thread이므로 하나의 요청에 병목이 되면 그 다음 요청이 계속 대기가 되어 O(n)관련 명령어에 주의가 필요
O(n) 명령어 대체
• keys (x) → scan (o) - 모든 key 조회, 재귀적으로 key를 호출할 수 있는 scan으로 대체하여 사용
• delete (x) → unlink (o) - 삭제할 key 전체 조회 후 삭제, unlink를 사용하면 백그라운드로 key를 삭제
Persistence
- Redis는 데이터를 디스크에도 저장하여 영속성(persistence)을 보장
스냅샷 백업 (Snapshotting)
• Redis는 주기적으로 데이터베이스 상태의 스냅샷을 디스크에 저장
• 스냅샷은 디스크의 RDB(Redis DataBase) 파일 형식으로 저장
• RDB 스냅샷을 생성하기 위해 Redis는 자식 프로세스를 생성(fork)
• Redis의 메모리 사용량 증가
주기적인 AOF 로그 (Append-Only File)
• AOF 로그는 모든 쓰기 작업을 기록하는 로그 파일
• Redis는 AOF 파일을 사용하여 서버를 시작하고 데이터베이스를 이전 상태로 복원
• AOF 파일은 모든 쓰기 연산을 포함하기 때문에, 파일 크기가 커질 수 있음
• Redis의 재시작 시간을 늘릴 수 있음
Redis를 캐시의 용도로만 사용할 것이라면 반드시 persistence 설정은 off 시켜주는 것이 좋다.
Pub/Sub
- Redis의 Pub/Sub(Publish/Subscribe) 기능은 메시지 브로커 역할
- 메시지를 발행(publish)하고 구독(subscribe)하는 방식으로 채널(channel)을 통해 실시간 메시지 전달
Pub/Sub 구성 요소
• Channel - 메시지가 전달되는 경로로 Publisher는 특정 Channel에 메시지를 보냄
• Publisher - 메시지를 Channel에 보내는 역할로 여러 Channel에 메시지를 보낼 수 있음
• Subscriber - 특정 Channel을 구독하여 전달되는 메시지를 수신하는 역할로 여러 채널을 동시에 구독할 수 있습니다.
Redis의 Pub/Sub은 메시지를 저장하지 않고 수신 확인도 하지 않기 때문에 메시지 저장과 전송 보장이 필요 없는 실시간 통신에 적합
Redis 설치
Redis 패키지 설치(Ubuntu)
## Redis 패키지 설치
sudo apt update
sudo apt install redis-server
# 설치 확인
sudo systemctl status redis-server
# 상태 예시
● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-05-17 14:48:36 KST; 25s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 1955115 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 18638)
Memory: 2.8M
CPU: 294ms
CGroup: /system.slice/redis-server.service
└─1955115 "/usr/bin/redis-server 127.0.0.1:6379" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >
5월 17 14:48:35 zium-Standard-PC-i440FX-PIIX-1996 systemd[1]: Starting Advanced key-value store...
5월 17 14:48:36 zium-Standard-PC-i440FX-PIIX-1996 systemd[1]: Started Advanced key-value store.
Redis 원격 접속 허용 설정
## Redis 설정파일
sudo vi /etc/redis/redis.conf
## bind 설정 수정
# 로컬호스트만 접근 허용
bind 127.0.0.1 ::1
# 모든 네트워크 접근 허용
bind 0.0.0.0 ::1
## 설정 적용을 위해 재시작
sudo systemctl restart redis-server.service
Redis 주요 설정
더보기
### redis.conf
## redis common
# redis가 bind할 interface 설정
bind 127.0.0.1
# bind 설정된 ip만 접속 가능하게 설정하는 모드
protected-mode yes
# Client, Slave 서버가 통신할 포트 설정
port 6379
# redis 서버의 초당 클라이언트 연결 개수
tcp-backlog 511
# 클라이언트에서 서버 접속 시의 timeout 값(0일 경우 상시)
timeout 0
# 최대 접속 가능한 클라이언트 수
maxclients 10000
# 클라이언트가 죽었을 때 서버가 확인하여 클라이언트와의 접속을 제거하는 시간
tcp-keepalive 300
# redis 서버에 password 설정
requirepass ""
# pid 경로 설정
pidfile /var/run/redis_6379.pid
# 로그 경로 설정
logfile ""
## redis RDB
# 메모리에 있는 전체 데이터를 디스크에 저장하는 옵션
save <seconds> <changes>
# RDB 저장 실패 시 Redis 데이터 쓰기를 할 수 없도록 설정하는 옵션
stop-writes-on-bgsave-error yes
# RDB 파일로 덤프 시 텍스트를 압축하여 파일 사이즈를 줄임
rdbcompression yes
# RDB 파일이 손상되었는지 확인
rdbchecksum yes
# RDB 파일 이름 설정
dbfilename dump.rdb
# dbfilename으로 설정한 RDB 파일이 저장되는 경로
dir ./
# redis 서버를 재기동하거나 전체 동기화 후 동기화에 사용된 RDB 파일 삭제 유무
rdb-del-sync-files no
## redis AOF
# aof 파일 사용 여부 설정
appendonly no
# aof 파일 이름 설정
appendfilename appendonly.aof
# AOF/RDB 파일 저장중에 fsync()를 실행할 지 말지 여부 설정
no-appendfsync-on-rewrite no
# aof 파일을 재작성하는 최소 크기 퍼센트 설정
auto-aof-rewrite-percentage 100
# aof 파일을 재작성하는 최소 크기 설정
auto-aof-rewrite-min-size 64mb
# redis 시작 시 aof 파일을 메모리로 로드 중 파일 손상 발생 시 행동 설정
aof-load-truncated yes
# aof 재작성 시 aof 파일을 rdb 포맷으로 쓰기
aof-use-rdb-peamble yes
참고 사이트
• https://loosie.tistory.com/803
• https://loosie.tistory.com/872
• https://lucas-owner.tistory.com/60