使用带有spring数据缓存的redis时如何启用分布式/集群缓存

Posted

技术标签:

【中文标题】使用带有spring数据缓存的redis时如何启用分布式/集群缓存【英文标题】:How to enable distributed/clustered cache when using redis with spring data cache 【发布时间】:2021-01-06 15:26:47 【问题描述】:

如何在使用带有spring-boot 缓存的 Redis 时启用分布式/集群缓存。

尤其是通过spring-boot-starter-data-redis使用Redis时

【问题讨论】:

【参考方案1】:

在 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;

通过属性或yaml文件设置它们的值

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

创建配置后,您可以通过 builder 为 RedisCacheManger 创建缓存配置。

@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 集群,请按此更新缓存属性。在这种情况下,如果您想要缓存特定的 bean 而不是将这些方法设为私有,那么一些 bean 将成为主要的。

【讨论】:

以上是关于使用带有spring数据缓存的redis时如何启用分布式/集群缓存的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cache with Redis - 如果与 Redis 的连接失败,如何优雅地处理甚至跳过缓存

Spring Cache:如何使用redis进行缓存数据?

springboot redis 缓存对象

Spring缓存注解

Spring学习-缓存

Spring Boot 中集成 Redis 作为数据缓存