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