# Redis
# Redis?
- 단순한 key-value 구조
- In-memory 데이터 저장소(RAM)
- 빠른 성능
- 평균 작업 속도 < 1ms
- 초당 수백만 건의 작업 가능
# Redis 주요 사용처
- 캐싱
- 채팅, 메시징, 대기열
- 세션 저장
- 실시간 분석
- 미디어 스트리밍
- 지리 공간 데이터 저장
- 머신 러닝
- 게임 순위표
# 캐싱 전략
- 읽기 전략
- Look-Aside(Lazy Loading)
- 쓰기 전략
- Write-Around
- Write-Through
# Redis 데이터 타입
- String
- Bitmaps
- Lists
- Hashes
- Sets
- Sorted Sets
- HyperLogLogs
- Streams
# 구현
# 카운팅(Counting)
String
- 단순 증감 연산
- INCR/ INCRBY / INCRBYFLOAT / HINCRBY / HICRBYFLOAT / ZINCRBY
Bits
- 데이터 저장공간 절약
- 정수로 된 데이터만 카운팅 가능
redis > SETBIT visitors:20220122 3 1
(integer) 0
redis > SETBIT visitors:20220122 6 1
(integer) 0
redis > BITCOUNT visitors:20220122
(integer) 2
HyperLogLogs
- 대용량 데이터를 카운팅 할 때 적절
- set과 비슷하지만 저장되는 용량은 매우 작음
- 저장된 데이터는 다시 확인할 수 없음
- 크롤링한 데이터 갯수 카운팅 등
# 메시징(Messaging)
Lists
- Blocking 기능을 이용해 Event Queue로 사용
- 키가 있을 때만 데이터 저장 가능 - LPUSHX / RPUSHX
- 이미 캐싱되어 있는 피드에만 신규 트윗을 저장
- 비효율적인 데이터의 이동을 막을 수 있다.
Streams
- 로그를 저장하기 가장 적절한 자료구조
- append-only
- 시간 범위로 검색/ 신규추가 데이터 수신/ 소비자별 다른 데이터 수신(소비자 그룹)
# 운영
# Redis에서 데이터를 영구저장하는 방법?
# Redis는 In-memory 데이터 스토어
- 서버 재시작 시 모든 데이터 유실
- 복제 기능을 사용해도 사람의 실수 발생 시 데이터 복원 불가
- Redis를 캐시 이외의 용도로 사용한다면 적절한 데이터 백업이 필요
# Redis Persistence Option
- RDB(snapshot)
- 자동: redis.conf 파일에서 SAVE 옵션
- 수동: BGSAVE 커멘드를 이용해 cli 창에서 수동으로 RDB 파일 저장
- SAVE 커멘드는 사용 X
- AOF(Append Only File)
- 자동: redis.conf 파일에서 auto-aof-rewrite-percentage 옵션
- 수동: BGREWRITEAOF 커멘드를 이용해 CLI 창에서 수동으로 AOF 파일 재작성
# RDB vs AOF 선택 기준
- 백업은 필요하지만 어느 정도 데이터 손실이 발생해도 괜찮은 경우
- RDB 단독 사용
- redis.conf 파일에서 SAVE 옵션 적절히 사용
- 장애 상황 직전까지의 모든 데이터가 보장되어야 할 경우
- AOF 사용
- APPENDFSYNC 옵션이 everysec인 경우 최대 1초 사이의 데이터 유실 가능
- AOF 사용
- 제일 강력한 내구성 필요시
- RDB, AOF 동시 사용
# Redis 아키텍처의 종류
Replication
- 단순 복제 연결
- 비동기식 복제
- HA 기능이 없으므로 장애시 수동 복구
Sentinel
- 자동 페일오버 가능한 HA 구성(High Availability)
- Sentinel 노드가 다른 노드를 감시
- 마스터가 비정상 상태일 때 자동으로 페일오버
- 연결 정보 변경 필요 없음
- Sentinel 노드는 항상 3대 이상의 홀수로 존재해야 함
Cluster
- 스케일 아웃과 HA 구성
- 키를 여러 노드로 자동 분할 저장(샤딩)
- 모든 노드가 서로를 감시하며, 마스터가 비정상 상태일 때 자동 페일오버
- 최소 3대의 마스터 노드 필요
# 사용하지 말아야할 커멘트
# 주의: Redis는 Single Thread로 동작
- keys * -> scan으로 대체
- Hash나 Sorted Set 등 자료구조
- 키 나누기(최대 100만개)
- hgetall -> hscan
- del -> unlink
# 변경하면 장애를 막을 수 있는 기본 설정값
STOP-WRITES-ON-BGSAVE-ERROR = NO
- yes(default)
- RDB 파일 저장 실패 시 redis로의 모든 write 불가능
MAXMEMORY-POLICY = ALLKEYS-LRU
- redis를 캐시로 사용할 때 Expire Time 설정 권장
- 메모리가 가득 찼을 때 MAXMEMORY-POLICY 정책에 의해 키 관리
- noeviction(default): 삭제 안함
- volatile-lru
- allkeys-lru
# Cache Stamped 현상
- TTL 값을 너무 작게 설정한 경우
# MaxMemory 값 설정
Persistence / 복제 사용시 MaxMemory 설정 주의
- RDB 저장 & AOF rewrite 시 fork()
- Copy-on-Write로 인해 메모리를 두배로 사용하는 경우 발생 가능
- Persistence / 복제 사용시 MaxMemory는 실제 메모리의 절반으로 설정
# Memory 관리
물리적으로 사용되고 있는 메모리를 모니터링
- used_memory: 논리적으로 redis가 사용하는 메모리
- used_memory_rss: OS가 redis에 할당하기 위해 사용하는 물리적 메모리 양
- 삭제되는 키가 많으면 fragmentation 증가
- 특정 시점에 피크를 찍고 다시 삭제되는 경우
- TTL로 인한 eviction이 많이 발생하는 경우