项目中如何整合本地缓存

前言

关于springboot整合缓存分析可以参考之前的一篇文章Spring cache缓存应用与总结;这次主要是分析如果整合本地缓存,比如cafe,其实这个也不麻烦,网上的案例很多,这里说一下结合项目整合时候遇到的问题,因为项目中已经使用redis作为缓存,引入redis依赖。

<!-- redis 配置-->        
<dependency>            
	<groupId>org.springframework.boot</groupId>            
	<artifactId>spring-boot-starter-data-redis</artifactId>        
</dependency>

通过注入使用:

    @Resource
    private RedisTemplate redisTemplate;

并且项目中还有一个关于redis注解缓存的配置,实际上项目中并没有使用到@Cacheable这样的注解,这个就是我整合本地缓存遇到的拦路虎。

@Configurable
public class RedisConfig {
    @Bean(name = "redisCacheManager")
    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
        redisCacheManager.setUsePrefix(true);
        return redisCacheManager;
    }
}

为什么是拦路虎,原因如下:
整合本地缓存Caffeine,肯定是要引入相关的依赖,然后借助springboot的自动缓存加载,进行注入使用;

		<dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>

看过springboot整合缓存的代码,你会发现,redis的缓存加载顺序在caffeine之前,并且我们项目中也引入了redis的依赖,所以要是使用本地缓存,必须要指定参数配置----spring.cache.type。

spring.cache.type=caffeine
spring.cache.caffeine.spec=initialCapacity=100,maximumSize=500,expireAfterWrite=600s

加载顺序源码:具体可以参数之前文章。

static {
        Map<CacheType, Class<?>> mappings = new EnumMap(CacheType.class);
        mappings.put(CacheType.GENERIC, GenericCacheConfiguration.class);
        mappings.put(CacheType.EHCACHE, EhCacheCacheConfiguration.class);
        mappings.put(CacheType.HAZELCAST, HazelcastCacheConfiguration.class);
        mappings.put(CacheType.INFINISPAN, InfinispanCacheConfiguration.class);
        mappings.put(CacheType.JCACHE, JCacheCacheConfiguration.class);
        mappings.put(CacheType.COUCHBASE, CouchbaseCacheConfiguration.class);
        mappings.put(CacheType.REDIS, RedisCacheConfiguration.class);
        mappings.put(CacheType.CAFFEINE, CaffeineCacheConfiguration.class);
        mappings.put(CacheType.SIMPLE, SimpleCacheConfiguration.class);
        mappings.put(CacheType.NONE, NoOpCacheConfiguration.class);
        MAPPINGS = Collections.unmodifiableMap(mappings);
    }

spring.cache.type=caffeine这个配置很重要,这样即使是先加载了redis,但是因为我们指定了type是caffeine,redis缓存在自动装配的时候,也不会注入成功。具体可以看@Conditional({CacheCondition.class}),这个注解的实现;

这个地方我配置了,并且也把caffeine的参数也加上了,但是启动之后还是使用的redis缓存,折腾了一会我找到原因了,还是项目自身的问题,上边我们说到,项目中有RedisConfig这个配置类,用于管理redis的缓存配置,虽然我们限制了springboot启动后,不自动加载注入redis缓存,但是并没有控制Spring自动注入bean,所以第二个拦路虎就是,因为项目启动时候,通过bean的方式注入了redis缓存manager(注:这个跟项目的启动也有关系,如果这个bean的注入早于caffeine的装配,那么缓存还是用的redis,反之则会是caffeine),导致没有注入caffeine的缓存manager,这个原因还是看源码:

@Configuration
@ConditionalOnClass({Caffeine.class, CaffeineCacheManager.class})
@ConditionalOnMissingBean({CacheManager.class})
@Conditional({CacheCondition.class})
class CaffeineCacheConfiguration {}

@ConditionalOnMissingBean({CacheManager.class}),当没有CacheManager这个bean的时候才会注入,分析完成。解决方式也很简单,把RedisConfig这个类上边的@Configuration注释掉就行了,不加载这个类。后续有调整的话,可以再进行使用。

/**
 *  该配置目前不需要使用,换成caffeine本地缓存
 */
public class RedisConfig {}

参考文章
https://zhuanlan.zhihu.com/p/109226599
https://www.cnblogs.com/cnndevelop/p/13429660.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值