ApiKeyUsageFlushTask.java

package com.yumu.noveltranslator.task;

import com.yumu.noveltranslator.adapter.out.persistence.mapper.ApiKeyMapper;
import com.yumu.noveltranslator.adapter.out.redis.ApiKeyCacheService;
import jakarta.annotation.PreDestroy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 定时将 Redis 中累积的 API Key 使用次数回写到 MySQL。
 * 每 60 秒执行一次,服务关闭时执行最后一次 flush。
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class ApiKeyUsageFlushTask {

    private final ApiKeyCacheService apiKeyCacheService;
    private final ApiKeyMapper apiKeyMapper;

    @Scheduled(fixedDelay = 60_000)
    public void flush() {
        apiKeyCacheService.flushUsage((apiKeyId, usage) -> {
            apiKeyMapper.incrementUsage(apiKeyId, usage);
            log.debug("flush: apiKeyId={}, usage={}", apiKeyId, usage);
        });
    }

    @PreDestroy
    public void flushOnShutdown() {
        log.info("服务关闭前执行最后一次 API Key usage flush");
        int count = apiKeyCacheService.flushUsage((apiKeyId, usage) -> {
            apiKeyMapper.incrementUsage(apiKeyId, usage);
        });
        log.info("关机 flush 完成: {} 个 key", count);
    }
}