Как включить распределенный / кластерный кэш при использовании redis с кешем данных spring

#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, обновите свойства кэша в соответствии с этим. В этом случае некоторые компоненты станут основными, если вы хотите кэшировать конкретный компонент, а не делать эти методы закрытыми.