아카이브사이트맵
© 2026 Rayon. All rights reserved.
DevDay
아티클랭킹스페이스채용
우아한형제들 favicon우아한형제들

Redis @CacheEvict(allEntries=true) 사용, 정말 괜찮을까요?

by DD
2025-11-04
8개월 전
조회수 26

@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 사용량 증가 문제를 예방할 수 있다.

이제 Redis를 멈춰보겠습니다: @CacheEvict 파헤치기
고급
아키텍처
Spring Boot
Redis
Lettuce
Java
Backend
Data
원문 읽기
원문 읽기

댓글 0

첫 번째 댓글을 남겨보세요!

관련 추천 글

무신사 개발팀, 대규모 이벤트 성공 비결 공개!

무신사 로고

CircuitBreaker로 서비스 안정성 확보!

올리브영 로고

Spring Boot 4.1 출시 후 최신 Spring 생태계 소식 모음!

스프링 로고

Redis Stream 도입으로 세션 데이터 처리 성능 UP!

지마켓 로고

Spring Boot에서 Go로의 전환, 개발자는 무엇을 얻고 잃었을까?

레딧 로고

Spring AI 2.0 출시 및 CVE 급증 소식

스프링 로고
우아한형제들 favicon우아한형제들
고급
아키텍처
Spring Boot
Redis
Lettuce
Java
Backend
Data

관련 추천 글

무신사 개발팀, 대규모 이벤트 성공 비결 공개!

무신사 로고

CircuitBreaker로 서비스 안정성 확보!

올리브영 로고

Spring Boot 4.1 출시 후 최신 Spring 생태계 소식 모음!

스프링 로고