Spring Cache 指定CacheManager

本文详细介绍了如何在Spring Boot应用中配置Redis作为缓存存储,并实现Spring Cache的集成。通过自定义CacheManager,可以设置缓存的过期时间等参数,确保数据的有效性和一致性。

配置文件application.properties中配置redis的相关配置

spring.redis.database=
spring.redis.host=
spring.redis.port=

Spring Cache 配置文件

@EnableCaching
@Configuration
public class CacheConfig extends CachingConfigurerSupport {

    private final RedisConnectionFactory redisConnectionFactory;

    @Autowired
    public CacheConfig(RedisConnectionFactory redisConnectionFactory) {
        this.redisConnectionFactory = redisConnectionFactory;
    }

    // 配置一个CacheManager 来支持spring cache的缓存注解
    @Bean
    public CacheManager cacheManager() {
        RedisCacheConfiguration configuration = RedisCacheConfiguration
                .defaultCacheConfig()
                .entryTtl(Duration.ofDays(1)) //过期时间
                ;

        return RedisCacheManager
                .builder(redisConnectionFactory)
                .cacheDefaults(configuration)
                .build();
    }

}
cacheManager()方法继承的是CachingConfigurerSupport类

AbstractCachingConfiguration是spring cache的配置文件加载方法,可以看到useCachingConfigurer方法里调用了cacheManager方法,就这样完成了指定spring cache的 CacheManager
@Configuration
public abstract class AbstractCachingConfiguration implements ImportAware {
     ......省略

	@Autowired(required = false)
	void setConfigurers(Collection<CachingConfigurer> configurers) {
		if (CollectionUtils.isEmpty(configurers)) {
			return;
		}
		if (configurers.size() > 1) {
			throw new IllegalStateException(configurers.size() + " implementations of " +
					"CachingConfigurer were found when only 1 was expected. " +
					"Refactor the configuration such that CachingConfigurer is " +
					"implemented only once or not at all.");
		}
		CachingConfigurer configurer = configurers.iterator().next();
		useCachingConfigurer(configurer);
	}

	/**
	 * Extract the configuration from the nominated {@link CachingConfigurer}.
	 */
	protected void useCachingConfigurer(CachingConfigurer config) {
		this.cacheManager = config::cacheManager;
		this.cacheResolver = config::cacheResolver;
		this.keyGenerator = config::keyGenerator;
		this.errorHandler = config::errorHandler;
	}

}

若不指定CacheManager,会从spring容器中查找是否有存在CacheManager,若存在一个CacheManager会使用该CacheManager,若存在多个CacheManager则会抛出异常,即必须指定一个。

### CacheManager 的使用方法 在 Spring 框架中,`org.springframework.cache.CacheManager` 是一个核心接口,用于管理缓存。从 Spring 3.1 开始,该接口与 `org.springframework.cache.Cache` 一起被引入,以统一不同的缓存技术并简化开发过程 [^3]。`CacheManager` 接口提供了一系列方法来管理缓存,例如获取、添加、删除缓存等。 #### 获取 Cache 实例 要使用 `CacheManager`,首先需要获取一个 `Cache` 实例。这可以通过调用 `CacheManager` 的 `getCache` 方法实现。如果指定的缓存不存在,某些实现可能会自动创建它。 ```java Cache cache = cacheManager.getCache("myCache"); ``` #### 添加缓存条目 一旦获得了 `Cache` 实例,就可以向缓存中添加条目。这通常通过 `put` 方法完成。 ```java cache.put("key", "value"); ``` #### 删除缓存条目 如果需要从缓存中删除条目,可以使用 `evict` 方法。 ```java cache.evict("key"); ``` #### 清除缓存 清除整个缓存中的所有条目,可以调用 `clear` 方法。 ```java cache.clear(); ``` ### 配置示例 为了在 Spring 应用程序中使用 `CacheManager`,通常需要进行一些基本的配置。这里以使用 `ConcurrentMapCacheManager` 为例,展示如何通过 Java 配置类来配置 `CacheManager`。 ```java @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager(); } } ``` 在这个配置类中,`@EnableCaching` 注解启用了缓存支持,而 `ConcurrentMapCacheManager` 是一个简单的 `CacheManager` 实现,适用于单机环境下的缓存需求。 对于更复杂的场景,例如使用 Redis 或 EhCache,配置会有所不同。例如,使用 Redis 时,需要配置 `RedisCacheManager` 并提供 Redis 连接工厂。 ```java @Bean public CacheManager redisCacheManager(RedisConnectionFactory factory) { return RedisCacheManager.builder(factory).build(); } ``` ### 问题解决 当使用 `CacheManager` 时,可能会遇到一些常见问题。例如,如果 `CacheManager` 没有被正确配置,可能会导致无法找到对应的 `Cache` 实例,从而引发异常。此外,如果缓存数据的大小超过了预期,可能会导致内存溢出等问题。 对于这些问题,确保 `CacheManager` 的正确配置是关键。同时,对于内存敏感的应用,应该考虑使用合适的缓存策略,比如设置缓存的最大条目数或使用过期策略。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值