cachedemo-三种缓存代码实现

89 阅读2分钟

springcache

1.结合caffeine

导包

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

配置


//本地进程
@EnableCaching
@Configuration
public class CacheConfig extends CachingConfigurerSupport {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .initialCapacity(100)
                .maximumSize(10_000))
        // 如果缓存种没有对应的value,通过createExpensiveGraph方法同步加载  buildAsync是异步加载
        //.build(key -> createExpensiveGraph(key))
        ;
        return cacheManager;
    }

}

2.结合redis

导包

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

配置文件

cache:
  type: redis

配置manager

@EnableCaching
@EnableConfigurationProperties(CacheProperties.class)
@Configuration
public class RedisCacheConfig {

    /**
     * 自定义 RedisCacheManager
     * <p>
     * 修改 Redis 序列化方式,默认 JdkSerializationRedisSerializer
     *
     * @param redisConnectionFactory {@link RedisConnectionFactory}
     * @param cacheProperties        {@link CacheProperties}
     * @return {@link RedisCacheManager}
     */
    @Bean
    public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory, CacheProperties cacheProperties){
        return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
                .cacheDefaults(redisCacheConfiguration(cacheProperties))
                .build();
    }

    /**
     * 自定义 RedisCacheConfiguration
     *
     * @param cacheProperties {@link CacheProperties}
     * @return {@link RedisCacheConfiguration}
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();

        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        config = config.computePrefixWith(name -> name + ":");

        // 覆盖默认key双冒号  CacheKeyPrefix#prefixed
        return config;
    }

}

tpye只能指定一种方式,不能实现多级缓存

注解的使用

添加到方法上 当传参相同时,不会重复执行代码类的逻辑

@Component
public class springcache {
    @Autowired
    UserService userService;

    @Cacheable(cacheNames = "user", key = "'user'+#userId")
    //缓存输入key和输出key
    public User getUser(Long userId) {

        User byId = userService.getById(userId);

        return byId;
    }

    @CacheEvict(cacheNames = "user", key = "'userId'+#userId")
    public List<Long> evictMemberUidList(Long userId) {
        boolean b = userService.removeById(userId);
        return null;
    }
}

自定义cache

参考MallChat: mallchat的后端项目,是一个既能购物又能聊天的电商系统。以互联网企业级开发规范的要求来实现它,电商该有的购物车,订单,支付,推荐,搜索,拉新,促活,推送,物流,客服,它都必须有。持续更新ing (gitee.com) 中src/main/java/com/abin/mallchat/common/common/service/cache/BatchCache.java的实现 自定义cache 继承抽象类进行扩展,父类会对方法进行回调

注解实现多级缓存

闪电缓存实现数据一致性(更新频率低的接口)

1.aop可以跳过源代码的执行 只需要判断key,如果key存在,就直接返回缓存结果

2.通过Supplier执行不同的层次逻辑,T为返回值,可以传递point.proceed()

参考其他博主的博客

使用SpringAOP+Caffeine+Redis实现本地缓存与多级缓存@[TOC] 一、背景 公司想对一些不经常变动 - 掘金 (juejin.cn)