#spring-boot #redis #spring-data #spring-data-redis #spring-cache
#весенняя загрузка #redis #весна-данные #spring-data-redis #spring-cache
Вопрос:
Как включить распределенный / кластеризованный кэш при использовании Redis с spring-boot
кешем.
Особенно при использовании Redis через spring-boot-starter-data-redis
Ответ №1:
Включить кэширование в приложении spring boot очень просто. Вам нужно будет просто выполнить три шага.
- Определение конфигурации кэша
- Добавьте EnableCaching в любой класс конфигурации
- Предоставьте компонент CacheManager
Для Redis у нас есть RedisCacheManager, который можно настроить и создать.
Конфигурация кэша
@Configuration
@Getter
@Setter
@ConfigurationProperties(prefix = "cache")
public class CacheConfigurationProperties {
// Redis host name
private String redisHost;
// Redis port
private int redisPort;
// Default TTL
private long timeoutSeconds;
// TTL per cache, add enties for each cache
private Map<String, Long> cacheTtls;
}
Установите их значения через свойства или файл yaml, например
cache.redisHost=localhost
cache.redisPort=6379
cache.timeoutSeconds=1000
cache.cacheTtls.cach1=100
cache.cacheTtls.cach2=200
После создания конфигурации вы можете создать конфигурацию кэша для RedisCacheManger с помощью builder.
@Configuration
@EnableCaching
public class CacheConfig {
private static RedisCacheConfiguration createCacheConfiguration(long timeoutInSeconds) {
return RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(timeoutInSeconds));
}
@Bean
public LettuceConnectionFactory redisConnectionFactory(CacheConfigurationProperties properties) {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(properties.getRedisHost());
redisStandaloneConfiguration.setPort(properties.getRedisPort());
return new LettuceConnectionFactory(redisStandaloneConfiguration);
}
@Bean
public RedisCacheConfiguration cacheConfiguration(CacheConfigurationProperties properties) {
return createCacheConfiguration(properties.getTimeoutSeconds());
}
@Bean
public CacheManager cacheManager(
RedisConnectionFactory redisConnectionFactory, CacheConfigurationProperties properties) {
Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
for (Entry<String, Long> cacheNameAndTimeout : properties.getCacheTtls().entrySet()) {
cacheConfigurations.put(
cacheNameAndTimeout.getKey(), createCacheConfiguration(cacheNameAndTimeout.getValue()));
}
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfiguration(properties))
.withInitialCacheConfigurations(cacheConfigurations)
.build();
}
}
Если вы используете кластер Redis, обновите свойства кэша в соответствии с этим. В этом случае некоторые компоненты станут основными, если вы хотите кэшировать конкретный компонент, а не делать эти методы закрытыми.