spring data redis는 spring framework의 Cache Abstraction을 구현
- redis를 해당 Cache Abstraction으로 사용하기 위해서는 RedisCacheManager를 사용
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.create(connectionFactory);
}
다양한 설정을 적용할 수 있다.
RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig())
.transactionAware()
.withInitialCacheConfigurations(Collections.singletonMap("predefined",
RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues()))
.build();
RedisCacheManager는 기본적으로 lock을 사용하지 않는 RedisCacheWriter를 사용
- lock을 사용하지 않기 때문에 throughput에서 이점이 존재
- Cache, putIfAbsent, clean과 같이 여러 command를 보내는 명령어의 경우 non-atomic하게 동작할 수 있다.
- lock을 사용하는 경우, consistency를 보장할 수 있지만 throughput이 낮아질 수 있다.
- 다음 설정을 통해 lock을 적용할 수 있다.
RedisCacheManager cacheMangager = RedisCacheManager
.build(RedisCacheWriter.lockingRedisCacheWriter(connectionFactory))
.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig())
...
RedisCacheManager는 cache를 clear하기 위해 기본적으로 KEYS와 DEL을 사용
- KEYS 명령어의 경우 O(n) 명령어이기 때문에 반드시 주의해서 사용해야 한다.
- 이를 SCAN-based batch strategy를 사용해 성능 이슈를 최소화할 수 있다.
RedisCacheManager cacheManager = RedisCacheManager
.build(RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, BatchStrategies.scan(1000)))
.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig())
...
RedisCacheManager와 RedisCacheConfiguration의 기본 설정

- 기본적으로 RedisCache의 statistics가 disabled되어 있다.
- 따라서 local hit 및 miss 값을 수집하기 위해서는 RedisCacheManagerBuilder.enableStatistics()를 설정해줘야 한다.
Redis Cache Expiration
- TTL(Time-To-Live) : TTL은 create/update operation에 대해서만 set/reset이 된다.
- 여러번의 read가 발생하더라도 TTL 시간이 지나면 해당 값을 제거하게 된다.
- TTI(Time-To-Idle) : TTI는 read할 때에도 만료시간을 reset한다.
TTL
고정된 TTL값을 설정하거나 별도의 TtlFunction을 구현해 각 entry마다 별도의 TTL을 설정해줄 수도 있다.
- fixed duration
RedisCacheConfiguration fiveMinuteTtlExpirationDefaults =
RedisCacheConfiguration.defaultCacheConfig().enableTtl(Duration.ofMinutes(5));
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(fiveMinuteTtlExpirationDefaults)
.build();
- dynamic duration
enum MyCustomTtlFunction implements TtlFunction {
INSTANCE;
@Override
public Duration getTimeToLive(Object key, @Nullable Object value) {
// compute a TTL expiration timeout (Duration) based on the cache entry key and/or value
}
}
RedisCacheConfiguration defaults = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(MyCustomTtlFunction.INSTANCE);
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(defaults)
.build();
TTI
- TTI 설정은 반드시 TTL 설정이 되어 있어야 한다.
- enableTimeToIdle()을 통해서 TTI 설정을 할 수 있다.
@Configuration
@EnableCaching
class RedisConfiguration {
@Bean
RedisConnectionFactory redisConnectionFactory() {
// ...
}
@Bean
RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration defaults = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(5))
.enableTimeToIdle();
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(defaults)
.build();
}
}
'Spring Data Redis(스프링 데이터 레디스)' 카테고리의 다른 글
| Redis Streams (0) | 2024.01.14 |
|---|---|
| Redis Pub/Sub (0) | 2023.12.29 |
| Redis Serializers (1) | 2023.12.29 |
| RedisTemplate (0) | 2023.12.29 |
| Redis Connection Modes (0) | 2023.12.29 |