Spring Cache && Caffeine 高性能缓存库-多个缓存区域

时间:2024-12-11 15:16:23

在 Caffeine 中,你可以配置多个缓存区域,每个区域都有自己的配置和缓存数据。要配置多个缓存区域,你需要为每个区域创建一个 Cache 实例,并为它们分别配置。

以下是一个使用 Spring Boot 和 Caffeine 配置多个缓存区域的例子:

配置缓存区域

在你的 Spring Boot 配置类中,配置多个缓存区域:我们创建了一个 SimpleCacheManager Bean,并为其配置了两个缓存区域。每个缓存区域都有自己的名称、过期时间和最大缓存大小。

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Configuration
@EnableCaching
public class CaffeineConfig {

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        List<CaffeineCache> caches = new ArrayList<>();

        // 配置第一个缓存区域
        Cache<Object, Object> cache1 = Caffeine.newBuilder()
                .expireAfterWrite(60, TimeUnit.SECONDS)
                .maximumSize(100)
                .build();
        caches.add(new CaffeineCache("cache1", cache1));

        // 配置第二个缓存区域
        Cache<Object, Object> cache2 = Caffeine.newBuilder()
                .expireAfterWrite(30, TimeUnit.SECONDS)
                .maximumSize(50)
                .build();
        caches.add(new CaffeineCache("cache2", cache2));

        cacheManager.setCaches(caches);
        return cacheManager;
    }
}

使用缓存区域

在你的服务类中使用 Spring Cache 的注解来缓存数据,并指定要使用的缓存区域:我们使用了 @Cacheable 注解来缓存 getUserByIdFromCache1 和 getUserByIdFromCache2 方法的结果,并分别指定了不同的缓存区域。

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "cache1", key = "#id")
    public User getUserByIdFromCache1(Long id) {
        // 模拟从数据库中获取用户数据
        return new User(id, "User " + id);
    }

    @Cacheable(value = "cache2", key = "#id")
    public User getUserByIdFromCache2(Long id) {
        // 模拟从数据库中获取用户数据
        return new User(id, "User " + id);
    }
}