Redis는 어떻게 TTL을 지원할까?

YeJi Kim·2023년 4월 30일
0

데이터베이스

목록 보기
3/5

Redis는 특정 시간 동안만 데이터가 저장되는 TTL(Time To Live) 기능을 'expire'라는 명칭으로 제공한다. JWT refresh token을 저장할 때 처럼 일정한 시간 동안만 데이터를 저장해야 하는 경우에 해당 기능이 유용하게 사용된다.

문득 "Redis는 어떻게 TTL을 지원할까?"라는 의문이 들었다.



Redis의 TTL 특성

  • Redis는 지정된 시간이 지나면 키가 자동으로 삭제되는 TTL 기능을 제공한다.
  • 만료 시간을 설정하지 않으면 사용자가 명시적으로 삭제하지 않는 한 영원히 저장된다.
  • 현재 컴퓨터 시간을 기반으로 TTL이 동작하기 때문에 만료 시간을 1000초로 설정해 놓고 현재 컴퓨터 시간을 2000초로 바꾸면 즉시 만료된다. 현재 컴퓨터 시간을 기반으로 TTL이 동작하기에, Redis 인스턴스가 현재 켜져 있지 않더라도 시간이 카운팅 된다.
  • 2.4에서는 TTL 오차가 0~ 1초였지만 2.6부터는 TTL 오차가 0초 ~ 1 밀리초로 개선되었다.



TTL 동작 과정

Redis는 수동적인 만료와 능동적인 만료를 지원한다.

  • 수동적인 만료
    • 액세스를 시도할 때까지 실제로 키를 만료(삭제)하지 않는다. 키를 읽을 때마다 키가 이미 만료되었는지 확인하고 만료된 경우 자동으로 null키를 반환하고 삭제한다.
    • 구현이 단순하다는 장점이 있다.
    • 하지만 키에 접근하지 않으면 영원히 만료되지 않으며 계속해서 메모리 공간을 차지한다는 치명적인 단점이 있다. 그래서 수동적인 만료의 단점을 보완하기 위한 것이 능동적인 만료이다.
  • 능동적인 만료
    • 주기적으로 무작위의 몇 개의 키를 확인하고 만료된 키가 있으면 계속 진행하며 키를 제거한다.
    • 구체적인 예시는 다음과 같다.

      Redis가 초당 10회로 다음 작업을 수행한다.

      1. TTL이 첨부된 임의의 키 20개를 테스트한다.
      2. 20개 중 만료된 모든 키를 삭제한다.
      3. 20개 중 25% 이상이 만료된 경우, 1단계를 반복한다.
    • 간단히 말하자면 확률 알고리즘을 활용하여 만료된 키의 비율을 확인하고 만료된 키가 많다면 무작위로 키를 확인하고 필요에 따라 만료하는 작업을 반복한다.



expire 명령어 사용하기

set [key name] [value]
키-값 추가하기


expire [key name] [seconds]
TTL 설정하기


expireat [key name] [seconds from Unix start point]
만료될 시간 추가하기(단, Unix timestamp를 기준으로 작성해야 한다.


ttl [key name]
남은 시간 확인하기


pttl [key name]
남은 millisecond 확인하기



[참고자료]
https://redis.io/commands/expire/
https://www.pankajtanwar.in/blog/how-redis-expires-keys-a-deep-dive-into-how-ttl-works-internally-in-redis
https://www.digitalocean.com/community/cheatsheets/how-to-expire-keys-in-redis

profile
이전의 기록들 👉 https://blog.naver.com/reviewerkyj

1개의 댓글

comment-user-thumbnail
2023년 5월 1일

저도 redis를 사용해보면서 TTL의 사용에 대해 고민해본적이 있는데요 데이터 정합성을 위해 적절한 TTL을 사용하는 것이 중요하다고 생각하는데 예지님은 어떤 기준으로 TTL을 설정하셨는지 궁금합니다~~

답글 달기