Redis @TimeToLive

BB·2023년 1월 11일
0

@TimeToTive 를 모르고 두 가지 방법을 해봤는데

// 1. 저장을 해도 redisTemplate.key("search") 값 반환이 안됨
RedisTemplate.expire(key, timeout, unit)

// 2. 동작을 안함..
@Bean
public CacheManager cacheManager10s(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10));
    return RedisCacheManager.builder(lettuceConnectionFactory).cacheDefaults(cacheConfiguration).build();
}

@Cacheable(vlaue = "...", cacheManager = "cacheManager10s")
void cache(){...}
  • phantom copy

    @TimeToLive를 사용하면 이런 값들이 생기는데

RedisKeyExpiredEvent 를 지원하기 위해 ApplicationEventPublisher 가 만료된 key 값을 유지한다.

없애기 위해서는 @EnableKeyspaceEvents(shadowCopy = OFF) 을 적용하라고 나와있지만 여러곳에서 사용해봐도 자동완성이 안 나타나고,

이런 기본 키들은 expire되지만 idx가 expire 안된 문제점을 해결하기 위해 설정했던 @EnableRedisRepositories 에서 showCopy 가 있었다.

EnableRedisRepositories(shadowCopy = RedisKeyValueAdapter.ShadowCopy.OFF,
	enavlekeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_DEMAND)

price 클래스의 경우 최신데이터값이 중요하고 최근 한 시간 값들만 검색할 수 있게 만든 것이므로 특별히 이벤트가 필요 없어 phantom copy를 제거하였다.

  • 제거완료


ref:
idx 문제
https://stackoverflow.com/questions/41693774/spring-redis-indexes-not-deleted-after-main-entry-expires

@TimeToLive
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis.repositories.expirations

profile
공부

0개의 댓글