트러블슈팅

Redis Repository를 사용했을 때 ttl이 끝나도 모두 삭제되지 않는 에러

계양 꿀주먹 2024. 2. 22. 04:01

@Id값만 TTL로 사라지고 그 외에는 남아있는 문제가 발생

 

Redis Repository Hash말고 Set도 저장이 됨

기본적으로 @RedisHash에서 @Id 어노테이션이 적용된 key에 대해서만 ttl 기능이 동작한

 

@RedisHash를 통한 RedisRepository 방식에서는 Set에서 secondary index 데이터를 삽입 및 제거하며 index를 유지 관리하는데, 이때 index 정리가 수행되기 위해서는 keyspace events가 탐지되어야 하며, keyspace events에 대한 설정이 되어 있어야 한다고 합니다.

 

이를 해결하기 위해 

@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfig {
    
    ---
    }
}

@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP) 

를 추가하여 해결할 수 있었습니다.

해당 옵션을 설정했을 때 Spring Data Redis에서 Key Events를 수신하게 되며, Key expired events 수신 이후 Set을 정리하게 됩니다.

 

* key space event로 인해 오버헤드가 발생해 성능이 저하될 수 있지만 refresh token을 개발할 때  Spring Data JPA를 사용하는 것과 비슷해서 쉽게 사용할 수 있기에 Repository를 사용하게 되었습니다.

 

reference 

https://wildeveloperetrain.tistory.com/273