当前位置: 首页 > article >正文

基于Spring Boot的多级缓存架构实现

基于Spring Boot的多级缓存架构实现

以下是一个基于Spring Boot的多级缓存架构实现示例


多级缓存架构实现方案

1. 依赖配置(pom.xml)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 缓存配置类
@Configuration
@EnableCaching
public class MultiLevelCacheConfig {

    // 一级缓存(本地缓存)
    @Bean
    public CacheManager caffeineCacheManager() {
        CaffeineCacheManager manager = new CaffeineCacheManager();
        manager.setCaffeine(Caffeine.newBuilder()
                .maximumSize(1000)
                .expireAfterWrite(30, TimeUnit.SECONDS)); // 本地缓存比Redis缓存更短
        return manager;
    }

    // 二级缓存(Redis缓存)
    @Bean
    public CacheManager redisCacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(5))
                .serializeValuesWith(SerializationPair.fromSerializer(RedisSerializer.json()));

        return RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .transactionAware()
                .build();
    }

    // 组合缓存管理器
    @Bean
    @Primary
    public CacheManager multiLevelCacheManager(
            @Qualifier("caffeineCacheManager") CacheManager level1,
            @Qualifier("redisCacheManager") CacheManager level2) {
        return new MultiLevelCacheManager(level1, level2);
    }
}
3. 多级缓存管理器实现
public class MultiLevelCacheManager implements CacheManager {

    private final CacheManager level1; // 本地缓存
    private final CacheManager level2; // Redis缓存
    private final ConcurrentMap<String, Cache> cacheMap = new ConcurrentHashMap<>();

    public MultiLevelCacheManager(CacheManager level1, CacheManager level2) {
        this.level1 = level1;
        this.level2 = level2;
    }

    @Override
    public Cache getCache(String name) {
        return cacheMap.computeIfAbsent(name, 
            key -> new MultiLevelCache(
                level1.getCache(name), 
                level2.getCache(name)
            ));
    }

    @Override
    public Collection<String> getCacheNames() {
        return Stream.concat(
            level1.getCacheNames().stream(),
            level2.getCacheNames().stream()
        ).collect(Collectors.toSet());
    }

    // 多级缓存实现
    static class MultiLevelCache implements Cache {
        private final Cache level1;
        private final Cache level2;
        private final String name;

        public MultiLevelCache(Cache level1, Cache level2) {
            this.level1 = level1 != null ? level1 : new NoOpCache();
            this.level2 = level2 != null ? level2 : new NoOpCache();
            this.name = level1.getName() + ":" + level2.getName();
        }

        @Override
        public String getName() {
            return name;
        }

        @Override
        public Object getNativeCache() {
            return this;
        }

        @Override
        public ValueWrapper get(Object key) {
            // 先查一级缓存
            ValueWrapper value = level1.get(key);
            if (value == null) {
                // 二级缓存查询
                value = level2.get(key);
                if (value != null) {
                    // 回填一级缓存
                    level1.put(key, value.get());
                }
            }
            return value;
        }

        @Override
        public <T> T get(Object key, Class<T> type) {
            // 实现逻辑类似get方法
            T value = level1.get(key, type);
            if (value == null) {
                value = level2.get(key, type);
                if (value != null) {
                    level1.put(key, value);
                }
            }
            return value;
        }

        @Override
        public void put(Object key, Object value) {
            // 同时写入两级缓存
            level1.put(key, value);
            level2.put(key, value);
        }

        @Override
        public void evict(Object key) {
            // 同时清除两级缓存
            level1.evict(key);
            level2.evict(key);
        }

        @Override
        public void clear() {
            level1.clear();
            level2.clear();
        }
    }

    // 空缓存实现(容错)
    static class NoOpCache implements Cache {
        // 实现基础的Cache方法,返回空值
    }
}
4. 业务层使用
@Service
public class ProductService {

    @Cacheable(value = "products", key = "#id")
    public Product getProduct(Long id) {
        // 数据库查询逻辑
        return productRepository.findById(id)
               .orElseThrow(() -> new NotFoundException("Product not found"));
    }

    @CacheEvict(value = "products", key = "#product.id")
    public void updateProduct(Product product) {
        productRepository.save(product);
    }
}
5. 配置说明(application.yml)
spring:
  cache:
    multi-level:
      level1:
        ttl: 30s    # 本地缓存时间
        max-size: 1000
      level2:
        ttl: 5m     # Redis缓存时间
  redis:
    host: redis-cluster.prod
    port: 6379
    timeout: 2000ms

关键实现要点

  1. 缓存层级策略
Client Level1 Level2 DB 查询缓存 命中返回 查询二级缓存 返回结果 返回结果 查询数据库 返回数据 回填数据 返回数据 alt [二级缓存未命中] alt [未命中] Client Level1 Level2 DB
  1. 一致性保障
  • 写操作:同时清除两级缓存(@CacheEvict​)
  • 读操作:二级缓存命中后自动回填一级缓存
  • TTL策略:一级缓存TTL(30s) < 二级缓存TTL(5m)
  1. 性能优化
  • 本地缓存:使用Caffeine高性能缓存库
  • 异步回填:可扩展为异步加载(需自定义CacheLoader)
  • 批量操作:支持@Cacheable的批量查询优化

扩展建议

  1. 缓存预热
@PostConstruct
public void preloadHotData() {
    // 加载热点数据到缓存
    hotProducts.forEach(product -> 
        cacheManager.getCache("products").put(product.getId(), product));
}
  1. 监控集成
@Bean
public MeterRegistryCustomizer<MeterRegistry> cacheMetrics() {
    return registry -> {
        CaffeineCacheManager caffeine = context.getBean(CaffeineCacheManager.class);
        RedisCacheManager redis = context.getBean(RedisCacheManager.class);
        
        // 注册Caffeine监控
        CacheMetrics.monitor(registry, caffeine, "level1");
        // 注册Redis监控
        CacheMetrics.monitor(registry, redis, "level2");
    };
}
  1. 防雪崩策略
// 在MultiLevelCache.get方法中添加
ValueWrapper get(Object key) {
    try {
        // 添加分布式锁检查
        if (lockManager.tryLock(key)) {
            // 实际查询逻辑
        }
    } finally {
        lockManager.unlock(key);
    }
}


http://www.kler.cn/a/579159.html

相关文章:

  • 【vscode编辑器配置】
  • Linux中的TCP编程接口基本使用
  • PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构
  • 启智畅想集装箱号码识别技术,具备的特点与优势
  • python机试1:读取和输出数据
  • 开发ai模型最佳的系统是Ubuntu还是linux?
  • 深度学习/强化学习调参技巧
  • 如何在rust中解析 windows 的 lnk文件(快捷方式)
  • Android Coil3缩略图、默认占位图placeholder、error加载错误显示,Kotlin(5)
  • Java直通车系列14【Spring MVC】(深入学习 Controller 编写)
  • 2025-3-9 一周总结
  • XML多子元素、多属性及XSD数据格式验证 Java
  • QTS单元测试框架
  • 大语言模型从理论到实践(第二版)-学习笔记(一)transformer理论与实践
  • 基于C语言的控制台小游戏——打砖块
  • JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件
  • Vue3 路由标签的三种写法 子路由 路由传递参数的两种写法 接收参数 解构赋值
  • 【Python】Django 中的算法应用与实现
  • 【SpringBoot3】使用Easy-Trans做字典翻译
  • 使用STM32CubeMX实现LED灯每秒闪烁一次(STM32G070CBT6单片机)