Spring boot 如何在使用redis和spring数据缓存时启用分布式/群集缓存

Spring boot 如何在使用redis和spring数据缓存时启用分布式/群集缓存,spring-boot,redis,spring-data,spring-data-redis,spring-cache,Spring Boot,Redis,Spring Data,Spring Data Redis,Spring Cache,如何在将Redis与spring boot缓存一起使用时启用分布式/群集缓存 特别是当通过spring boot starter数据使用Redis时,在spring boot应用程序中启用缓存非常简单。你只需要遵循三个步骤 定义缓存配置 将EnableCaching添加到任何配置类 提供CacheManager bean 对于Redis,我们提供了可配置和创建的RedisCacheManager 缓存配置 @Configuration @Getter @Setter @Configurati

如何在将Redis与
spring boot
缓存一起使用时启用分布式/群集缓存


特别是当通过spring boot starter数据使用Redis时,在spring boot应用程序中启用缓存非常简单。你只需要遵循三个步骤

  • 定义缓存配置
  • 将EnableCaching添加到任何配置类
  • 提供CacheManager bean
对于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;
}
创建配置后,可以通过生成器为RedisCacheManager创建缓存配置

@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();
  }
}
@配置
@启用缓存
公共类CacheConfig{
私有静态RedisCacheConfiguration createCacheConfiguration(长超时秒){
返回RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(持续时间秒(超时秒));
}
@豆子
公共LettuceConnectionFactory重新连接工厂(CacheConfigurationProperties){
RedisStandaloneConfiguration RedisStandaloneConfiguration=新的RedisStandaloneConfiguration();
setHostName(properties.getRedisHost());
设置端口(properties.getRedisPort());
返回新的LettuceConnectionFactory(重新标准配置);
}
@豆子
公共重新缓存配置缓存配置(缓存配置属性属性){
返回createCacheConfiguration(properties.getTimeoutSeconds());
}
@豆子
公共缓存管理器缓存管理器(
RedisConnectionFactory RedisConnectionFactory、CacheConfigurationProperties(属性){
Map cacheConfigurations=newhashmap();
对于(条目cacheNameAndTimeout:properties.getCacheTtls().entrySet()){
cacheConfigurations.put(
cacheNameAndTimeout.getKey(),createCacheConfiguration(cacheNameAndTimeout.getValue());
}
返回RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(缓存配置(属性))
.withInitialCacheConfigurations(缓存配置)
.build();
}
}
如果您使用的是Redis cluster,请按照此更新缓存属性。在这种情况下,如果您希望缓存特定的bean而不是使这些方法私有,那么一些bean将成为主bean

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