EXPIRE seconds

Redis 開発者教育
Redis Developer Course
Redis 定期点検/技術支援
Redis Technical Support
Redis エンタープライズサーバ
Redis Enterprise Server

지정된 시간(초) 후 key 자동 삭제

사용법은 expire key seconds [type] 이다.
📍 type은 string/list/set/zset/hash/stream 중 하나입니다.
      ent811부터 type이 추가되었습니다. 꼭 사용하시기 바랍니다.

Example

명령>set key value
결과>1
명령>expire key 5 string
결과>1
명령>ttl key string
결과>3
명령>ttl key string
결과>-2
명령>get key
결과>(nil)

애니메이션 보기


set 명령으로 겹쳐써지면 expire time 제거

expire time 이 설정된 후 같은 key에 set 명령이 수행되면 expire time이 제거되어 지워지지 않는다.
이런 명령은 set, getset 이 있다.
incr, lpush, sadd, zadd, hset 같은 명령은 해당되지 않는다.

Example

명령>set key value
결과>1
명령>expire key 5 string
결과>1
명령>ttl key string
결과>3
명령>set key new_value
결과>1
명령>ttl key string
결과>-1
명령>get key
결과>new_value

애니메이션 보기


rename은 expire time이 제거되지 않음

key name을 바꾸어도 expire time은 제거되지 않는다.

Example

명령>set key value
결과>1
명령>expire key 5 string
결과>1
명령>rename key new_key string
결과>OK
명령>ttl key string
결과>-2
명령>get key
결과>(nil)

애니메이션 보기


Expire 명령 실행 후 레디스 서버가 다운 되었다면

다운 된 후 expire로 지정한 시간 이후에 서버가 시작되었다면?
서버가 시작될 때 expire time을 check해서 del 명령을 실행한다.
사실, expire 명령을 실행해도 AOF에는 expireat 으로 기록된다.

Example

명령>set key value
결과>1
명령>expire key 5 string
결과>1
명령>shutdown
명령>Redis Server Start   10초 후 시작  
결과>del key10   자동 실행  

Expire가 설정된 키들을 삭제하는 3가지 경우

1) 주기적(1초에 10번)으로 만료된 키들을 삭제

1초에 10번(100ms 마다) 실행되는 serverCron()->databasesCron()에서 activeExpireCycle()를 수행해서 만료된 키를 삭제한다.
📚 주기는 redis.conf hz 값에 의해서 결정된다. '10'이면 1초에 10번, '20'이면 1초에 20번 실행된다.
이때는 activeExpireCycle()을 SLOW type으로 실행하는데,   SLOW type은 수행 제한 시간을 25ms로 설정되어 있다.   그런데 25ms를 초과해서 실행 할 수도 있다.   왜냐하면, 키가 expire되었는지 random으로 검사하는데 한 세트(20회씩 16회를 반복해서, 총 160회)를 실행하고 소요시간을 검사해서 25ms가 지났으면 종료한다.
25ms가 지나지 않았으면 다시 한 세트(20회 * 16회)를 반복 실행하고 소요시간을 다시 검사한다.   이런 방식으로 진행하기 때문에 소요시간이 25ms 이상이 될 수 있다.   예를 들어 한 세트 수행하는데 10ms가 걸린다면 두 번째 세트는 20ms로 제한 시간이 25ms 이하이므로 통과되고, 세 번째 세트 수행 후 30ms일때 비교해서 25ms 이상이므로 종료된다.   만약 삭제할 키들이 많고 필드가 많은 hash 키들일 경우 한 세트가 50ms가 걸릴 수도 있다. 그러면 100ms 마다 실행되는데 50ms를 사용했다면 CPU 사용률이 50%가 된다.
info stats 명령을 실행하면 expired_time_cap_reached_count 값이 나오는데, 이것이 25ms 이상 실행된 count이다.

2) 명령을 실행하면 끝날때 마다 만료된 키들을 삭제

명령을 실행하면 끝날때 마다 beforeSleep()에서 activeExpireCycle()를 수행해서 만료된 키를 삭제한다.
이때는 FAST type으로 실행하는데, 제한 시간이 1ms로 짧다.   그러나 FAST type도 위와 같이 한 세트가 20회 * 16회 단위로 실행되므로, 삭제할 키들이 있을 경우 일반적으로 5ms 이상은 소요된다.

3) 각 명령에서 해당 키 하나만 삭제

각 명령을 실행할때, 주 작업을 실행하기 전에 키가 만료되었는지 확인해서 만료되었으면 삭제한다.
예를 들어 get key 명령을 실행하면 "key"가 있는지 확인해서 있으면 expire time을 확인해서 expire 되었으면 key를 삭제하고 클라이언트에서 null을 리턴한다.   Expire time이 아직 지나지 않았거나 expire time이 없으면 value을 리턴한다.


만료 키 삭제와 CPU 사용률


📚<1번 이미지>
  • 레디서 서버에서는 1초에 10번(redis.conf hz) 만료일시가 설정된 키들을 삭제한다.
  • Commands/sec 17:50 시간대를 보면 명령은 실행되지 않고 있다. 그런데 CPU 사용률(%)은 최대 50%까지 올라간 것을 확인할 수 있다.
  • 메모리(RSS) 사용량은 17:49부터 만료일시가 설정된 키들이 삭제되어 사용량이 줄어들고 있다.
  • 이 경우 약 1,500만개 키들이 5분간 삭제되었다. 초당 평균 5만개 키들이 삭제된 것이다.
    Peak 시간대에는 약 7만 개까지 삭제했을 것이므로 CPU를 50%까지 사용한 것이다.
  • 이 경우를 설명하는 이유: 새로운 명령이 입력되지 않아도 CPU를 사용할 수 있다는 것과 DEL 명령이 실행되지 않아도 만료일시가 설정된 키들이 자동으로 삭제되면서 키 개수, 메모리 사용량이 줄어들 수 있다는 것이다.


명령문

EXPIRE key seconds [type]

  • 이 명령은 version 1.0.0 부터 사용할 수 있습니다.
  • 논리적 처리 소요시간은 O(1) 있습니다.
  • ent811 type 추가.
관련 명령 SETEX, TTL, PERSIST, PSETEX, EXPIREAT, PEXPIRE, PEXPIREAT, PTTL
Clients for Java Jedis, Lettuce, Redisson
Clients for C Hiredis

<< RENAMENX EXPIRE EXPIREAT >>

Email 返事がかかってなれば、メールでお知らせします。