2025년 12월 3일 수요일

redis 역산 - 임시

 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);

    }

}


댓글 없음: