sql >> Base de Datos >  >> NoSQL >> Redis

Cómo habilitar el caché distribuido/agrupado cuando se usa redis con caché de datos de primavera

Habilitar el almacenamiento en caché en la aplicación Spring Boot es muy simple. Solo tendrías que seguir tres pasos.

  • Definir configuración de caché
  • Agregue EnableCaching a cualquier clase de configuración
  • Proporcionar un bean CacheManager

Para Redis, tenemos RedisCacheManager que se puede configurar y crear.

Configuración de caché

@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;
}

Establezca sus valores a través de propiedades o un archivo yaml como

cache.redisHost=localhost
cache.redisPort=6379
cache.timeoutSeconds=1000
cache.cacheTtls.cach1=100
cache.cacheTtls.cach2=200

Una vez que haya creado la configuración, puede crear la configuración de caché para RedisCacheManger por constructor.

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

Si está utilizando un clúster de Redis, actualice las propiedades de caché según eso. En esto, algunos beans se convertirían en primarios si desea almacenar un bean específico en lugar de hacer que estos métodos sean privados.