Redis @CacheEvict(allEntries=true) 사용, 정말 괜찮을까요?
by DD
7개월 전
조회수 16
@CacheEvict(allEntries = true) 설정은 Spring 캐시 추상화와 Redis 동작 방식의 충돌을 야기함
RedisCache.clear() 호출 시, KEYS 명령어를 사용하여 전체 키를 삭제하는 문제 발생
실무에서는 allEntries = true 사용 지양하고, SCAN 기반의 안전한 삭제 전략을 권장
@CacheEvict 동작 원리: Spring과 Redis의 만남
구체적으로 @CacheEvict 어노테이션은 Spring의 CacheEvictOperation 객체로 변환된다. 따라서 allEntries = true 설정 시, RedisCache.clear()가 호출되어 전체 캐시 삭제를 시도한다. 반면, 이 과정에서 KEYS 명령어가 사용되어 성능 저하를 유발할 수 있다.
KEYS vs SCAN: 캐시 삭제 전략의 트레이드오프
KEYS 명령어는 O(N)의 시간 복잡도를 가지며, 전체 키를 순회하며 삭제한다. 따라서 Redis의 다른 요청을 블록하여 지연 시간 증가를 야기한다. 반면, SCAN은 cursor 기반으로 탐색하여 삭제하므로, 안정성을 확보할 수 있지만, 여전히 전체 키 탐색은 피할 수 없다.
실무 적용 가이드: 안전한 캐시 삭제 전략
따라서 운영 환경에서는 allEntries = true 설정을 지양하고, SCAN 기반의 삭제 로직을 구현해야 한다. 구체적으로, RedisCacheManager Bean을 재정의하여 BatchStrategies.Scan을 사용하도록 설정한다. 결과적으로, API 타임아웃 및 Redis CPU 사용량 증가 문제를 예방할 수 있다.