개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Redis TTL — 키 만료와 자동 삭제

2026년 1월 25일
RedisTTLExpiration만료캐시

캐시된 데이터는 영원히 유효하지 않습니다. 1시간 뒤에는 최신 데이터로 갱신되어야 하고, 세션은 비활성 상태가 되면 삭제되어야 합니다. Redis의 TTL(Time To Live) 기능이 이 역할을 합니다.

TTL(Time To Live): 데이터가 유효한 남은 시간. 이 시간이 지나면 Redis가 자동으로 키를 삭제합니다.

만료 시간 설정

SET 명령과 함께

# 초 단위 만료
SET session:abc "data" EX 3600

# 밀리초 단위 만료
SET rate:user:1 0 PX 60000

# 특정 Unix 타임스탬프에 만료
SET token:xyz "secret" EXAT 1718700000

# 밀리초 타임스탬프
SET token:xyz "secret" PXAT 1718700000000

기존 키에 만료 설정

SET user:cache "data"

# 초 단위
EXPIRE user:cache 3600

# 밀리초 단위
PEXPIRE user:cache 3600000

# 특정 타임스탬프
EXPIREAT user:cache 1718700000

# 밀리초 타임스탬프
PEXPIREAT user:cache 1718700000000

만료 시간 확인

SET token "secret" EX 3600

# 남은 초 확인 (-1: 만료 없음, -2: 키 없음)
TTL token
# 3598

# 밀리초 단위
PTTL token
# 3598421

만료 제거

# 만료 시간 제거 (영구 보존으로 변경)
SET temp "data" EX 3600
PERSIST temp

TTL temp
# -1 (만료 없음)

만료 동작 방식

Redis는 두 가지 방식을 조합해 만료된 키를 처리합니다.

지연 삭제 (Lazy Deletion)

키에 접근할 때 만료 여부를 확인합니다. 만료되었으면 그때 삭제합니다.

GET expired_key
# Redis: 만료 시각 확인 → 지났으면 삭제 → nil 반환

주기적 삭제 (Active Expiration)

Redis가 주기적으로(기본 100ms마다) 무작위로 만료된 키를 샘플링해 삭제합니다. 접근되지 않는 키도 시간이 지나면 메모리에서 제거됩니다.

두 방식을 조합하므로, 만료 시각이 지나도 정확히 그 시각에 삭제된다는 보장은 없습니다. 약간의 지연이 있을 수 있으나 정상 동작입니다.

실전 패턴

세션 갱신 (Sliding Expiration)

사용자가 활동할 때마다 세션 만료 시간을 연장합니다.

# 로그인 시 세션 생성 (30분)
SET session:abc123 "user:1000" EX 1800

# 요청마다 만료 시간 갱신
EXPIRE session:abc123 1800

# 30분 동안 아무 활동 없으면 자동 삭제

캐시 무효화

# 데이터 캐시 (5분)
SET cache:product:500 "..." EX 300

# 상품 정보 변경 시 즉시 무효화
DEL cache:product:500

# 다음 조회 시 DB에서 새로 가져와 캐시

Rate Limiting

# 첫 요청: 카운터 생성 + 1분 만료
SET rate:user:1000 1 NX EX 60

# 이후 요청마다 카운터 증가
INCR rate:user:1000

# 남은 시간 확인 (창 리셋까지 남은 시간)
TTL rate:user:1000

임시 인증 코드

# 이메일 인증 코드 (10분 유효)
SET verify:code:user@example.com "483921" EX 600

# 인증 시 코드 확인
GET verify:code:user@example.com

# 인증 성공 시 즉시 삭제 (재사용 방지)
DEL verify:code:user@example.com

EXPIRETIME — 만료 절대 시각 확인

SET token "secret" EX 3600

# 만료될 Unix 타임스탬프 확인
EXPIRETIME token
# 1718703600

PEXPIRETIME token
# 1718703600000 (밀리초)

GETEX — 조회와 만료 설정 동시에

# 조회하면서 만료 시간도 갱신 (세션 슬라이딩에 유용)
GETEX session:abc123 EX 1800

# 조회하면서 만료 제거
GETEX session:abc123 PERSIST

GETEX: Redis 6.2에 추가된 명령. GET과 EXPIRE를 하나의 원자적 연산으로 처리합니다.

← 이전 글Redis 캐시 전략 — Cache Aside, Write Through, Write Back
다음 글 →Redis Persistence — 메모리 데이터를 디스크에 저장하는 방법