@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(){...}
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