- CacheService.flush: redis.keys() 블로킹 → SCAN cursor + UNLINK 논블로킹. UNLINK 미지원 환경은 DEL로 폴백. 500 batch 단위. - 30초 주기 @Scheduled checkHealth: Redis ping → disabled 자동 토글. startup 시 disabled=true여도 Redis 재기동되면 자동 복구. - recordError 헬퍼: AtomicLong errorCount + volatile lastError. 로그 throttle (n==1 || n%100==0만 WARN, 나머지 DEBUG). - CacheStats record + GET /api/admin/cache/stats (admin only). - 설계서: docs/design/336-cache-scan-recovery/README.md (Approved). Refs: #336
36 lines
953 B
Java
36 lines
953 B
Java
package com.tasteby.controller;
|
|
|
|
import com.tasteby.security.AuthUtil;
|
|
import com.tasteby.service.CacheService;
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
import java.util.Map;
|
|
|
|
@RestController
|
|
@RequestMapping("/api/admin")
|
|
public class AdminCacheController {
|
|
|
|
private final CacheService cacheService;
|
|
|
|
public AdminCacheController(CacheService cacheService) {
|
|
this.cacheService = cacheService;
|
|
}
|
|
|
|
@PostMapping("/cache-flush")
|
|
public Map<String, Object> flushCache() {
|
|
AuthUtil.requireAdmin();
|
|
cacheService.flush();
|
|
return Map.of("ok", true);
|
|
}
|
|
|
|
/**
|
|
* #336 — 캐시 상태 가시화: disabled / errorCount / lastError.
|
|
* 외부 모니터링 도구 도입 전 운영자가 어드민에서 확인 가능.
|
|
*/
|
|
@GetMapping("/cache/stats")
|
|
public CacheService.CacheStats cacheStats() {
|
|
AuthUtil.requireAdmin();
|
|
return cacheService.getStats();
|
|
}
|
|
}
|