Spring Boot 中使用Caffeine快取的簡單例子

可可西里發表於2024-01-21

Caffeine 快取是 Java 的高效能快取庫。本文簡單記錄下 Caffeine 快取的用法。

依賴配置

<dependencies>
    <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></dependencies>

程式碼配置

我們需要初始化 Caffeine 物件以及 Caffeine 快取管理器。

@Configurationpublic class CaffeineConfig {
    @Bean
    public Caffeine<Object, Object> caffeine() {
        return Caffeine.newBuilder().expireAfterWrite(60, TimeUnit.MINUTES);
    }
    @Bean
    public CacheManager cacheManager(Caffeine<Object, Object> caffeine) {
        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
        caffeineCacheManager.setCaffeine(caffeine);
        return caffeineCacheManager;
    }}

使用快取

首先,我們建立一個 Service.

@Service@Slf4jpublic class AddressService {
    private static final Map<Long, AddressDTO> ADDRESS_TABLE = new HashMap<>();
    static {
        ADDRESS_TABLE.put(1L, new AddressDTO(1, "廣東"));
        ADDRESS_TABLE.put(2L, new AddressDTO(2, "深圳"));
        ADDRESS_TABLE.put(3L, new AddressDTO(3, "坂田"));
    }
    @Cacheable(value = "address_cache", key = "#addressId")
    public AddressDTO getAddress(long addressId) {
        log.info("AddressService getAddress, addressId: {}", addressId);
        return ADDRESS_TABLE.get(addressId);
    }}

其次,我們建立一個 Controller.

@RestControllerpublic class CaffeineController {
    @Autowired
    private AddressService addressService;
    @Autowired
    private CacheManager cacheManager;
    @GetMapping("/{addressId}")
    public AddressDTO getAddress(@PathVariable long addressId) {
        return addressService.getAddress(addressId);
    }
    @GetMapping("/cache/{addressId}")
    public AddressDTO findAddressFromCache(@PathVariable long addressId) {
        Cache addressCache = cacheManager.getCache("address_cache");
        if (addressCache != null) {
            return (AddressDTO)addressCache.get(addressId).get();
        }
        return null;
    }}

然後就可以測試了。我們根據列印的日誌來判斷快取是否生效了。

總結

當我們想從快取中查詢某條資料時,可以注入 CacheManager,透過快取名稱來獲取對應快取,再根據key獲取value。就像 findAddressFromCache裡那樣。
這只是個簡單例子,實際使用的時候還要多關注他的配置引數,最基本的就是快取的過期時間,這樣才能更好的使用它。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70036623/viewspace-3004587/,如需轉載,請註明出處,否則將追究法律責任。

相關文章