栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

项目中如何整合本地缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

项目中如何整合本地缓存

前言

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

        
            
	org.springframework.boot            
	spring-boot-starter-data-redis        

通过注入使用:

    @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的自动缓存加载,进行注入使用;

		
            com.github.ben-manes.caffeine
            caffeine
        

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

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

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

static {
        Map> 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注释掉就行了,不加载这个类。后续有调整的话,可以再进行使用。

public class RedisConfig {}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346079.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号