Notice
Recent Posts
Recent Comments
Link
solyrion
Redis 캐시 만료시간 (TTL & Eviction) 본문
개요
Redis는 DB의 데이터를 메모리에 일시적으로 저장하는 공간입니다.
그렇기 때문에 저장 공간이 한정적입니다. 따라서 데이터를 무한히 저장할 수는 없고,
실제 DB의 데이터와 현재 캐싱되어 있는 데이터가 불일치할 수도 있기 때문에
기존 데이터들이 적절히 삭제될 필요가 있습니다.
이때 사용될 수 있는 방법이 TTL 값 설정입니다.
TTL
Redis는 데이터베이스 내의 특정 키에 대한 만료 시간을 설정할 수 있으며,
이는 데이터의 유효 기간 또는 만료시간을 정의하는 데 사용됩니다.
특징
- 단위: 보통 초(second) 단위로 설정되며, 밀리초(ms) 단위도 가능 (PTTL, PEXPIRE).
- 자동 삭제: 설정된 시간이 지나면 자동으로 데이터가 삭제되어 메모리 공간을 효율적으로 관리.
- 데이터 수명 관리: 캐시 데이터 유지 및 관리에 유용.
예시
EXPIRE
> SET abc 10
"OK"
> EXPIRE abc 60
(integer) 1
abc라는 키에 10을 저장한 뒤 만료 시간을 60초로 설정합니다.
참고로 INCR, RENAME 같은 명령어로 값을 변경해도 TTL은 갱신되지 않습니다.
SET - EX
> SET abc 10 ex 60
"OK"
SET 명령어로 값을 저장할 때 만료 시간을 함께 설정할 수 있습니다.
TTL
// 만료시간이 설정된 경우
> TTL abc
(integer) 58
// 만료시간이 설정되지 않은 경우
> TTL b
(integer) -1
// 키가 존재하지 않는 경우
> TTL c
(integer) -2
반환값:
- 만료 시간이 설정된 경우 : 남은 시간(초)
- 만료 시간이 없는 경우 : -1
- 키가 없는 경우 : -2
기존 키 덮어쓰기
> SET abc 10 ex 60
"OK"
> TTL abc
(integer) 58
> SET abc 11
"OK"
> TTL abc
(integer) -1
기존 키에 새로운 값을 저장하면 TTL은 유지되지 않고 사라집니다.
키 만료 시 삭제 방식
TTL이 만료되었다고 해서 Redis가 바로 키를 지우는 건 아닙니다.
Redis는 두 가지 방식으로 만료된 키를 삭제합니다.
1) Passive
- 클라이언트가 키에 접근할 때 만료되었다면 그 시점에 삭제.
- 특징:
- 접근 시점에만 삭제 → 접근 없는 키는 남아 있을 수 있음.
- 장점: 불필요한 리소스 사용 줄임.
- 단점: 접근이 거의 없는 키는 메모리를 차지한 채 남을 수 있음.
2) Active
- TTL이 있는 키 중 20개를 무작위 선택해 만료 여부 확인 후 삭제.
- 특징:
- 20개 중 25% 이상 만료 → 추가로 20개 확인 (1초에 약 10회 수행).
- 장점: 주기적으로 정리해 메모리 낭비 방지.
- 단점: 랜덤 샘플링이라 모든 만료 키를 즉시 삭제하지는 않음.
Eviction
TTL 외에도 Redis는 메모리 부족 상황에서 키를 제거할 수 있습니다.
TTL이 “시간 기반 만료”라면, Eviction은 “메모리 기반 삭제”입니다.
Eviction 정책 종류
- noeviction : 기본값. 메모리가 부족하면 에러만 반환, 데이터 삭제 X.
- allkeys-lru : 모든 키 중 LRU(Least Recently Used) 키 삭제.
- allkeys-random : 모든 키 중 무작위 삭제.
- volatile-lru : TTL이 있는 키 중 LRU 방식으로 삭제.
- volatile-random : TTL이 있는 키 중 무작위 삭제.
- volatile-ttl : TTL이 있는 키 중 만료가 가장 임박한 키부터 삭제.
정리
- TTL
→ 키의 “시간 만료” 기준. 개발자가 직접 지정. - Eviction
→ 메모리 부족 시 Redis가 “강제 삭제”하는 기준. 정책에 따라 결정.
👉 결론:
- TTL은 시간, Eviction은 메모리로 작동 조건이 다릅니다.
- 동시에 적용 가능하며, TTL이 걸려 있어도 allkeys-* 정책에서는 언제든지 삭제될 수 있습니다.
- 따라서 둘을 함께 활용하면 메모리 관리와 캐시 일관성을 모두 챙길 수 있습니다.
'Redis' 카테고리의 다른 글
| Redis vs Memcached (0) | 2025.11.18 |
|---|---|
| Redis Cluster (0) | 2025.10.09 |
| Spring에서의 Redis (1) | 2025.09.01 |
| Redis란? (1) | 2025.08.08 |
Comments