- 목차
TTL은 Redis에 저장된 Key가 얼마 동안 유지될지 지정하는 만료 시간입니다. 캐시 데이터, 인증 코드, 세션, 임시 데이터처럼 일정 시간이 지나면 자동으로 삭제되어야 하는 데이터에 특히 유용합니다.
이번 글에서는 Redis에서 TTL을 설정하고 확인하는 방법부터 실무에서 주의해야 할 부분까지 정리해보겠습니다.
1. Redis TTL이란?
Redis의 TTL(Time To Live)은 특정 Key가 만료되기까지 남은 시간을 의미합니다.
예를 들어 다음과 같은 데이터가 있다고 가정해보겠습니다.
SET user:1001 "Alice"별도의 만료 시간을 설정하지 않았다면 이 Key는 직접 삭제하기 전까지 계속 유지됩니다.
하지만 캐시 데이터라면 일정 시간이 지난 후 자동으로 제거하고 싶을 수 있습니다.
이때 EXPIRE 명령어를 사용할 수 있습니다.
EXPIRE user:1001 60위 명령은 user:1001 Key를 60초 후 만료하도록 설정합니다.
2. TTL 확인하기
Key의 남은 만료 시간은 TTL 명령어로 확인할 수 있습니다.
TTL user:1001예를 들어 결과가 다음과 같다면,
(integer) 42해당 Key는 약 42초 후 만료된다는 의미입니다.
TTL의 특수 반환값
TTL을 확인할 때는 -1, -2 값을 알아두는 것이 좋습니다.
TTL key결과의 의미는 다음과 같습니다.
반환값 | 의미 |
|---|---|
양수 | Key가 만료되기까지 남은 시간(초) |
| Key는 존재하지만 만료 시간이 설정되지 않음 |
| Key가 존재하지 않음 |
예를 들어,
SET test "hello"
TTL test만료 시간을 설정하지 않았기 때문에 결과는 다음과 같습니다.
(integer) -13. SET과 동시에 TTL 설정하기
실무에서는 SET 이후 별도로 EXPIRE를 실행하기보다 데이터를 저장하면서 TTL을 함께 지정하는 방법을 자주 사용합니다.
SET auth:code:1001 "839201" EX 300EX 300은 해당 Key를 300초 후 만료시키겠다는 의미입니다.
즉, 인증번호를 5분 동안만 저장하는 방식으로 사용할 수 있습니다.
SET verification:user@example.com "839201" EX 300캐시 역시 동일합니다.
SET cache:product:1001 '{"id":1001,"name":"Keyboard"}' EX 600이 경우 상품 캐시는 10분 동안 유지됩니다.
왜 SET + EX를 사용하는 것이 좋을까?
다음과 같이 두 개의 명령을 실행할 수도 있습니다.
SET cache:user:1001 "data"
EXPIRE cache:user:1001 600하지만 애플리케이션에서 두 명령 사이에 장애가 발생한다면 SET은 성공하고 EXPIRE는 실행되지 않을 가능성이 있습니다.
그러면 의도와 달리 만료되지 않는 Key가 남을 수 있습니다.
반면,
SET cache:user:1001 "data" EX 600처럼 하나의 SET 명령으로 값과 만료 시간을 함께 설정하면 이러한 문제를 피할 수 있습니다.
따라서 단순한 String 데이터를 저장하면서 TTL이 반드시 필요한 경우라면 SET ... EX 형태를 우선 고려하는 것이 좋습니다.
4. 초보다 정밀한 TTL이 필요하다면
Redis에서는 초 단위뿐 아니라 밀리초 단위의 만료 시간도 지정할 수 있습니다.
EXPIRE
초 단위입니다.
EXPIRE mykey 6060초 후 만료됩니다.
PEXPIRE
밀리초 단위입니다.
PEXPIRE mykey 15001.5초 후 만료됩니다.
SET에서도 동일하게 EX와 PX를 사용할 수 있습니다.
SET mykey "value" EX 60SET mykey "value" PX 1500TTL 역시 밀리초 단위로 확인하고 싶다면 PTTL을 사용합니다.
PTTL mykey5. 특정 시각에 Key 만료시키기
“지금부터 1시간”이 아니라 특정 시각에 만료시키고 싶은 경우도 있습니다.
이때는 EXPIREAT을 사용할 수 있습니다.
EXPIREAT event:coupon 1798761600EXPIREAT은 Unix timestamp를 기준으로 만료 시점을 지정합니다.
밀리초 단위의 Unix timestamp가 필요하다면 PEXPIREAT을 사용할 수 있습니다.
PEXPIREAT event:coupon 1798761600000예를 들어 이벤트 종료 시점, 쿠폰 만료 시점처럼 절대적인 종료 시간이 존재하는 데이터에 활용할 수 있습니다.
6. 설정된 TTL 제거하기
이미 TTL이 설정되어 있지만 Key를 계속 유지해야 하는 상황도 있습니다.
이때 PERSIST를 사용합니다.
PERSIST user:1001성공적으로 TTL이 제거되면 해당 Key는 자동으로 만료되지 않습니다.
확인해보겠습니다.
TTL user:1001결과:
(integer) -1Key는 존재하지만 TTL이 없는 상태입니다.
7. TTL을 다시 설정하면 어떻게 될까?
기존 Key에 다시 EXPIRE를 실행하면 TTL은 새 값으로 변경됩니다.
SET session:1001 "data" EX 3005분이 설정되어 있다고 가정하겠습니다.
이후 다음 명령을 실행하면,
EXPIRE session:1001 1800기존 TTL 대신 30분으로 다시 설정됩니다.
이 특징을 이용하면 사용자의 활동이 발생할 때마다 세션 만료 시간을 연장하는 방식도 구현할 수 있습니다.
사용자 요청
↓
세션 확인
↓
EXPIRE session:1001 1800
↓
30분으로 TTL 갱신이러한 방식은 Sliding Expiration 형태의 세션 관리에 활용할 수 있습니다.
8. 주의: Redis TTL은 Key 단위다
Redis TTL을 사용할 때 매우 중요한 특징이 있습니다.
TTL은 Value 내부의 특정 데이터가 아니라 Key 전체에 적용됩니다.
예를 들어 Hash가 있다고 가정해보겠습니다.
HSET user:1001 name "Alice"
HSET user:1001 email "alice@example.com"그리고,
EXPIRE user:1001 300을 실행하면 name 필드만 삭제되는 것이 아니라 user:1001이라는 Key 전체가 만료됩니다.
따라서 서로 다른 만료 정책이 필요한 데이터라면 Key 구조 자체를 분리하는 것을 고려해야 합니다.
예를 들어,
user:1001:profile
user:1001:verification
user:1001:cache처럼 데이터의 생명주기에 따라 Key를 설계할 수 있습니다.
9. TTL 설정 시 실무에서 주의할 점
TTL 없는 캐시 Key를 방치하지 않기
Redis를 캐시 용도로 사용하면서 TTL을 설정하지 않으면 Key가 계속 쌓일 수 있습니다.
SET cache:product:1001 "..."보다는 캐시 정책에 따라,
SET cache:product:1001 "..." EX 600처럼 만료 정책을 명시하는 것이 안전합니다.
물론 모든 Redis 데이터에 TTL이 필요한 것은 아닙니다. Redis를 영속 데이터나 별도의 자료구조 저장소로 사용하는 경우에는 서비스의 데이터 정책에 따라 판단해야 합니다.
모든 Key에 동일한 TTL을 적용하지 않기
데이터의 성격에 따라 적절한 TTL은 다릅니다.
예를 들면,
인증번호 → 3~5분
세션 → 서비스 정책에 따라 수십 분 이상
상품 캐시 → 수분~수십 분
변경이 적은 캐시 → 수시간 이상처럼 데이터의 변경 빈도와 오래된 데이터가 사용자에게 미치는 영향을 기준으로 결정하는 것이 좋습니다.
캐시 만료가 한 시점에 몰리지 않도록 고려하기
많은 Key에 동일한 TTL을 동시에 설정하면 비슷한 시점에 대량으로 만료될 수 있습니다.
이후 애플리케이션 요청이 한꺼번에 DB로 향하면서 순간적으로 부하가 증가할 수 있습니다.
상황에 따라 기본 TTL에 작은 랜덤 값을 추가하는 방법을 고려할 수 있습니다.
예를 들어 기본 TTL이 10분이라면,
600초 + random(0~60초)와 같이 분산시키는 방식입니다.
이를 TTL jitter라고 부르기도 하며, 캐시 만료 시점을 분산하는 데 도움이 됩니다.
10. Redis TTL 명령어 정리
자주 사용하는 명령어를 정리하면 다음과 같습니다.
명령어 | 설명 |
|---|---|
| 초 단위 TTL 설정 |
| 밀리초 단위 TTL 설정 |
| Unix timestamp 기준 만료 |
| 밀리초 Unix timestamp 기준 만료 |
| 남은 TTL을 초 단위로 확인 |
| 남은 TTL을 밀리초 단위로 확인 |
| 설정된 TTL 제거 |
| 값 저장과 동시에 초 단위 TTL 설정 |
| 값 저장과 동시에 밀리초 TTL 설정 |
마무리
Redis에서 TTL은 단순히 “Key를 몇 초 후 삭제한다”는 기능을 넘어 캐시와 임시 데이터의 생명주기를 관리하는 핵심 기능입니다.
기본적인 사용법은 매우 간단합니다.
SET cache:user:1001 "data" EX 600남은 시간을 확인하려면,
TTL cache:user:1001TTL을 제거하려면,
PERSIST cache:user:1001을 사용하면 됩니다.
실무에서는 특히 다음 세 가지를 기억해두면 좋습니다.
- TTL이 필수인 String 데이터라면 가능하면
SET ... EX처럼 저장과 만료 설정을 하나의 명령으로 처리합니다. - TTL은 필드가 아니라 Key 단위로 적용된다는 점을 고려해 Key 구조를 설계합니다.
- 대규모 캐시에서는 동일한 시점에 Key가 만료되지 않도록 TTL 분산 전략도 고려합니다.
Redis를 단순한 Key-Value 저장소가 아니라 캐시 시스템으로 제대로 활용하려면 Key 설계와 TTL 정책을 함께 설계하는 것이 중요합니다.
댓글
댓글 쓰기