redis에서, 키를 추가하고 일정 시간이 지나면 없어지게 해야 하는 경우가 있습니다. 이럴 때 set에 EX, PX, EXAT, PXAT 옵션을 줄 수 있습니다.

 


 이럴 때 redis에서 쓸 수 있는 명령어는 set입니다. set에는 여러 옵션이 있는데요. 

 

 

 이 중, 우리가 관심이 있는 expire 관련 옵션은 EX 혹은 PX입니다. EX는 뒤에 초가 붙고, PX는 뒤에 ms가 붙습니다. 예제를 하나 보겠습니다.

 

 

 set code 12345 EX 30을 입력했어요. 이는, 키가 code이고 value가 12345인 정보를 추가할 건데요. expire time은 생성된 지 30초 후라는 의미입니다. 생성한 직후 time을 쳐 보았더니 1665080157입니다. 그러면, 1665080187보다 크다면, 당연하게도 키가 code인 데이터가 제거될 겁니다. 몇 초 지나고 time과 get code를 실행해 보겠습니다.

 

 

 time을 봤더니 1665080314가 나왔습니다. 1665080314는 1665080187보다 큽니다. 즉, expire time보다 현재 시각이 더 뒤에 있기 때문에, key 값이 code인 데이터가 사라지게 됩니다.

 

 


 redis 6.2 버전 이후부터는 EXAT 옵션이 추가되었는데요. unix-time-seconds를 받는다고 되어 있어요. 이 값이 무엇인지 알아볼 필요가 있겠어요.

 

 date의 man page를 보면, %s 포멧에 대한 설명이 나오는데요. 1970년 1월 1일 0시 0분 0초 UTC부터 현재 시간까지 경과된 시간을 초 단위로 리턴하게 되어요.

 

 그래서 date +%s를 입력하면, 1665079299라는 이상한 수를 리턴하게 되는데요. 위에 후술한 바와 같이 1970년 1월 1일 0시 0분 0초 UTC로부터 경과된 초를 의미해요. 약 20초 후에, redis-cli에서, time을 입력해 보겠습니다.

 

 

 그러면, 1665079320이라는 수가 나오는데요. 위에서 date +%s의 결과와 21밖에 차이가 나지 않음을 볼 수 있어요. 고로, 옵션에서 말하는 unix-time-seconds는 해당 숫자와 관련이 깊음을 알 수 있겠네요.

 

 

 EXAT 옵션에는 unix-time-seconds가 붙습니다. 그리고 PXAT에는 유닉스 타임 ms가 붙는데요. EXAT만 알아도 문제 없을 듯 해요. 저는 EXAT 뒤에 1665079900을 넣어보겠습니다. 이는 unix time second 1665079900초일 때 까지 key가 code이고 값이 12345다라는 정보를 유지합니다.

 

 

 해당 작업을 수행하고 time을 찍어보니, 1665079880이 찍혔는데요. 이 시점에 키가 code인 것이 있습니다. 왜냐하면 1665079900초 이전이기 때문입니다.

 

 

 그런데 수 초가 지난 후에는 어떨까요? 유닉스 time seconds가 1665079911인데요. 이는 1665079900보다 큽니다. 이미 expired가 되었다는 의미입니다. get code로 키가 code인 데이터를 뽑아오려고 하면 nil이 떨어지는데요. 당연합니다. expire가 되어서 키가 제거되었기 때문입니다.

 

 


 그런데 중간에 업데이트가 발생하는 것과 상관 없이 키 자체의 유효 시간이 지나면 폐기하는 방법은 없을까요? KEEPTTL 옵션을 주면 가능합니다.

 

 

 먼저, 키 code의 값을 23456으로 설정했고, 추가 옵션으로 KEEPTTL을 설정했어요. 그 다음에 ttl code를 입력해 보니, -1이 떴어요. 그런데, 그 다음에 expire code 120이라고 입력했는데요. 이는 키 값이 code인 것의 유효 시간을 120으로 설정한다는 의미에요. 그 후에 ttl code를 입력해 보면 118이 나오는데요. 120보다 작음을 알 수 있어요.

 

 다음에, 키 값이 code인 value 값을 23456으로 설정했어요. KEEPTTL 옵션을 준 상태로요. 그러면, time to live 값이 유지되는데요. 몇 초를 흘려보내 보겠습니다.

 

 ttl code를 입력하니 -2가 뜨네요. code가 있는지 조회해 보니까 없다고 뜨네요. 이는, 23456으로 값이 업데이트 될 때 TTL 값을 유지한 상태였기 때문에, 120초 카운트 다운이 계속 유지되었기 때문입니다.