| 특성 | Lettuce | Jedis |
|---|---|---|
| 기반 | 비동기 I/O(Netty 사용) | 동기 I/O(블로킹) |
| 스레드 안정성 | Thread Safe(싱글 스레드에서 공유 가능) | Thread Not Safe |
| 비동기 처리 | 지원(비동기 및 논블로킹) | 미지원 |
| 성능 | 높은 성능(대규모 시스템) | 낮은 성능(단일 스레드 환경) |
| 반응형 지원 | 지원(Refactor와 함께 사용 가능) | 미지원 |
| 클러스터와의 호환성 | Redis Cluster 및 Sentinel 지원 | Redis Cluster 및 Sentinel 지원 |
| 설정 복잡도 | 상대적 복잡 | 상대적 간단 |
# 연결가능한네트위크(0.0.0.0=Anywhere)
bind 0.0.0.0
# 연결포트
port 6379
# 보호모드-redis가 외부(0.0.0.0)에 바인딩 되어있거나, 비밀번호가 설정되지 않으면 접속 차단
protected-mode yes
# Master노드의기본사용자비밀번호
requirepass redis
# 최대사용메모리용량(지정하지않으면시스템전체용량)
maxmemory 2gb
# 설정된최대사용메모리용량을초과했을때처리방식
# - noeviction:쓰기동작에대해error반환(Default)
# - Volatile-lru:expire가설정된key들중에서LRUalgorithm에의해서선택된key제거
# - allkeys-lru:모든key들중LRUalgorithm에의해서선택된key제거
# - volatile-random:expire가설정된key들중임의의key제거
# - allkeys-random:모든key들중임의의key제거
# - volatile-ttl:expiretime(TTL)이가장적게남은key제거(minorTTL)
maxmemory-policy volatile-lru
# == RDB관련설정 ==
# 저장할RDB파일명
dbfilename backup.rdb
# 15분 안에 최소 1개 이상의 key가 변경 되었을 때
save 900 1
# 5분 안에 최소 10개 이상의 key가 변경 되었을 때
save 300 10
# 60초 안에 최소 10000개 이상의 key가 변경 되었을 때
save 60 10000
# RDB 저장 실패시 write명령 차단 여부
stop-writes-on-bgsave-error no
# 연결가능한네트위크(0.0.0.0=Anywhere)
bind 0.0.0.0
# 연결포트
port 6379
# 보호모드-redis가 외부(0.0.0.0)에 바인딩 되어있거나, 비밀번호가 설정되지 않으면 접속 차단
protected-mode yes
# Master노드의기본사용자비밀번호
requirepass redis
# 최대사용메모리용량(지정하지않으면시스템전체용량)
maxmemory 2gb
# 설정된최대사용메모리용량을초과했을때처리방식
# - noeviction:쓰기동작에대해error반환(Default)
# - Volatile-lru:expire가설정된key들중에서LRUalgorithm에의해서선택된key제거
# - allkeys-lru:모든key들중LRUalgorithm에의해서선택된key제거
# - volatile-random:expire가설정된key들중임의의key제거
# - allkeys-random:모든key들중임의의key제거
# - volatile-ttl:expiretime(TTL)이가장적게남은key제거(minorTTL)
maxmemory-policy volatile-lru
# fsync 정책 (쓰기 성능 vs 신뢰성)
# everysec: 매 1초마다 디스크에 기록 (기본값, 추천)
# always: 매 명령어마다 디스크 기록 (신뢰성 높음, 성능 낮음)
# no: OS에 맡김 (속도 높음, 안전성 낮음)
appendfsync everysec
appendonly yes
appendfilename "appendonly.aof"
# AOF 리라이트 조건 - 7.2 버전이후로 삭제됨.
# auto-aof-rewrite-percentage 50 # 기존 AOF 파일보다 2배 커지면 리라이트
# auto-aof-rewrite-min-size 64mb # 최소 64MB 이상일 때만 리라이트 수행
# 리스타트 시 AOF 파일 복구 옵션 (기본값: yes)
aof-load-truncated yes
# RDB 관련 백업 병행
# 15분 안에 최소 1개 이상의 key가 변경 되었을 때
save 900 1
# 5분 안에 최소 10개 이상의 key가 변경 되었을 때
save 300 10
# 60초 안에 최소 10000개 이상의 key가 변경 되었을 때
save 60 10000
# database 개수 제한(기본값 16, 0~15)
databases 1
# 해킹에 위험한 명령어 무력화
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command DEBUG ""
rename-command CONFIG ""
rename-command SHUTDOWN ""
rename-command SAVE ""
rename-command BGSAVE ""
# 또는 명령어 바꾸기 (관리자만 알고 있는 명령어로)
# rename-command CONFIG "no_one_can_guess_this_123"
AUTH ${비밀번호}get <key> // <key>는 조회하려는 키 이름
ex) myKey
조회 성공 예시)
"1234"
조회 실패 예시)
(nil) // 값이 없는 경우
-------------------------------------------------------------------------------------
set <key> <value> // <key>는 생성하려는 키 이름, <value>는 저장할 값
ex) set myKey "1234"
// 만료 옵션 설정
set <key> <value> EX <ex value> // EX 는 초 단위로 만료 시간 설정
ex) set myKey "1234" EX 10 // 10초 뒤 자동 삭제
set <key> <value> PX <px value> // PX는 밀리초 단위로 만료 시간 설정
ex) set myKey PX 5000 // 5초 뒤 자동 삭제
// NX - 키 없을 때만 설정
// 키가 존재하지 않으면 값 설정. 키 존재하면 아무것도 작업도 수행 안함.
set myKey "1234" NX
// XX - 키가 있을 때만 설정
// 키가 존재할 때만 값 설정. 키가 존재하지 않으면 아무것도 수행 안함.
set myKey "1234" XX
// GETSET - 기존 값 가져오고 새 값 설정
GETSET myKey "4321"
(nil) // 기존 키가 없었으면 nil 반환
"1234" 기존 값이 "1234" 였을 경우 반환.
-------------------------------------------------------------------------------------
del <key> // <key>는 삭제하려는 키 이름
ex)
del myKey 또는 del mykey1 mykey2 // 여러 키 삭제 가능
삭제 성공 예시)
(integer) 1 (하나의 키 삭제 됨)
없는 키 삭제 예시)
(integer) 0
-------------------------------------------------------------------------------------services:
redis:
image: redis:latest
container_name: redis
environment:
TZ: "Asia/Seoul"
ports:
- "26379:6379" # 호스트 포트 26379를 컨테이너 포트 6379로 매핑
volumes:
- ./data:/data # Redis 데이터를 저장할 볼륨
restart: always # 컨테이너가 종료되면 자동으로 재시작
implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.3.5'
// starter-data-redis가 lettuce-core를 컴파일 의존하고 있기 때문에 자동으로 설치됨.
// implementation 'io.lettuce.core:lettuce-core'# Redis 서버 호스트 설정
spring.data.redis.host=localhost
# Redis 서버 포트 설정
spring.data.redis.prt=26379
# Redis 연결 패스워드 설정
spring.data.redis.password=96L03o04m$$
# Redis 데이터베이스 번호(기본 0번 데이터베이스 사용)
spring.data.redis.database=0
# Lecttuce 클라이언트 관련 설정
# 최대 커넥션 수
spring.data.redis.lettuce.pool.max-active=10
# 최대 유휴 커넥션 수(기본 값: 8, 제한 없음: -1)
spring.data.redis.lettuce.pool.max-idle=8
# 최소 유휴 커넥션 수(기본 값: 0)
spring.data.redis.lettuce.pool.min-idle=0
# 커넥션 풀 대기 시간(밀리초) (기본 값: -1, 무기한 대기를 의미)
# 커넥션 풀에서 새로운 커넥션을 얻기위해 요청을 보냈을 때, 사용한 커넥션 풀이 생길 때까지 기다리는 시간.
# 커넥션 풀이 고갈되어 더이상 커넥션을 할당 할 수 없으면 설정한 시간 이후 예외를 던진다.
spring.data.redis.lettuce.pool.max-wait=-1
# 연결 타임아웃 및 소켓 타임아웃 설정
# redis 서버와의 연결 타임아웃(밀리초)
spring.data.redis.timeout=2000
# 소켓 통신 타임아웃(밀리초)
spring.data.redis.connect-timeout=2000
# redis 연결 종료 타임아웃(밀리초) (기본값: 100)
spring.data.redis.lettuce.shutdown-timeout=100직렬화란 무엇이고 왜 필요한지?
역직렬화는 무엇인지?
직렬화 할 때, template.setKeySerializer과 template.setHashKeySerializer의 차이가 무엇인지.
RedisSerializer.json()과 RedisSerializer.java()의 차이가 무엇인지.
TTL
만료된 토큰 처리 블랙리스트 vs 기존 것을 덮어 씌우는 방식.
https 적용방법?
분산된 아키텍처에서 동기화 문제 해결 방법?
→ 분산 락: SETNX 또는 Redisson 같은 분산 락을 활용하여 동시 요청 순차 처리
→ 비즈니스 로직 설계: 재시도 로직 또는 분할 작업
→ 비관적 락: 데이터베이스에서 비관적 락 사용하여 데이터베이스 레벨에서 동시성 문제 처리.
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it 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.
Linux 커널 메모리 overcommit 정책이 비활성화(vm.overcommit_memory=0) 되어 있어서 redis 의 백그라운드(BGSAVE, AOF rewrite, 복제 등) 이 실패할 수 있다는 경고.
overcommit이란?
해결 방법