import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class RedisExpiryCalculator {
// 처음에 설정한 전체 만료 시간 (7일 = 604,800 초)
private static final long INITIAL_EXPIRATION_SECONDS = 60 * 60 * 24 * 7;
// 초를 밀리초로 변환하는 상수
private static final long MILLIS_PER_SECOND = 1000L;
/**
* Redis TTL 값(초 단위)을 이용하여 데이터가 입력된 시점의 타임스탬프(밀리초)를 계산합니다.
* * @param currentTTLSeconds getExpire() 메서드가 반환한 현재 남은 TTL (초 단위, long)
* @return 데이터가 입력된 시점의 UTC 에폭 타임스탬프 (밀리초 단위, long)
*/
public static long calculateSetTimeMillis(long currentTTLSeconds) {
// 1. 현재 시간 (시스템 시간)을 밀리초 단위로 가져옵니다.
long currentTimeMillis = System.currentTimeMillis();
// 2. 경과된 시간 (초) 계산: (전체 만료 시간) - (현재 남은 TTL)
long elapsedTimeSeconds = INITIAL_EXPIRATION_SECONDS - currentTTLSeconds;
// 3. 경과된 시간 (밀리초)로 변환합니다.
long elapsedTimeMillis = elapsedTimeSeconds * MILLIS_PER_SECOND;
// 4. 데이터 입력 시점을 계산합니다: (현재 시간) - (경과된 시간)
long setTimeMillis = currentTimeMillis - elapsedTimeMillis;
// *참고: -1 또는 -2 (키 없음/만료 없음) 같은 특수 값 처리는 Redis 클라이언트 로직에서 필요합니다.
// 이 계산 로직은 0보다 큰 TTL 값에 대해서만 유효합니다.
return setTimeMillis;
}
// 테스트용 main 메서드
public static void main(String[] args) {
// 예시: 현재 TTL이 5일(5 * 24 * 3600 = 432000 초) 남았다고 가정
long ttlRemaining = 5 * 24 * 3600;
long setTime = calculateSetTimeMillis(ttlRemaining);
System.out.println("--- Redis 데이터 입력 시점 계산 결과 ---");
System.out.println("1. 처음에 설정된 만료 시간: " + INITIAL_EXPIRATION_SECONDS + " 초 (7일)");
System.out.println("2. 현재 남은 TTL: " + ttlRemaining + " 초 (예시 값)");
// 계산 결과를 사람이 읽을 수 있는 형태로 변환 (시스템 기본 시간대 사용)
LocalDateTime setDateTime = Instant.ofEpochMilli(setTime)
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
System.out.println("3. 데이터 입력 시점 (Epoch Millis): " + setTime);
System.out.println("4. 데이터 입력 시점 (Local Time): " + setDateTime);
}
}