Redis Key Expire Event

hccho·2024년 9월 4일

스케줄을 수행하고 아직 처리상태가 완료되지 않은 건이 있는 경우에 스케줄의 메소드를 재수행하기 위해 레디스를 활용하였다.
1. 완료되지 않은 건이 있는 경우, 레디스에 데이터를 생성하고 TTL을 설정.
2. 만료 이벤트를 수신하여 스케줄 메소드 재실행.
3. 더이상 스케줄이 돌지 않아도 되면 레디스에 데이터를 생성하지 않는다.

위와 같은 식으로 활용하였다. 만료 이벤트는 아래를 참고하여 구현.

RedisConfig.class

KeyExpirationEvent 관련 Bean을 선언

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory());
        return redisMessageListenerContainer;
    }

    @Bean
    public KeyExpirationEventMessageListener keyExpirationEventMessageListener() {
        return new KeyExpirationEventMessageListener(new RedisMessageListenerContainer() {{
            setConnectionFactory(redisConnectionFactory());
        }});
    }

KeyExpirationEventListener.class

이벤트를 수신할 클래스 생성

@Slf4j
@Component
public class KeyExpirationEventListener extends KeyExpirationEventMessageListener {
    public KeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    public void onMessage(Message message, byte[] pattern) {
        String expiredKey = new String(message.getBody());
        String hashKey = "찾을 키";
        if (expiredKey.startsWith(hashKey)) {
            log.info("Key expired: {}", expiredKey);
            handledExpiredKey();
        }
    }

    private void handledExpiredKey() {
        // 만료 이벤트를 받았을 때, 동작할 로직
    }
}

참고: https://wildeveloperetrain.tistory.com/299

0개의 댓글