(十七)、 SpringBoot 集成 Caffeine 實現本地緩存


(十七)、 SpringBoot 集成 Caffeine 實現本地緩存

 

 

1、簡介

github:  https://github.com/ben-manes/caffeine

Caffeine 是高性能的本地(進程內)緩存框架。提供接近最佳的命中率。

2、maven依賴

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

 

3、集成caffeine

Caffeine與 SpringBoot集成有兩種方式:

  1. 一種是我們直接引入 Caffeine 依賴,然后使用 Caffeine 方法實現緩存。相當於使用原生api
  2. 引入 Caffeine 和 Spring Cache 依賴,使用 SpringCache 注解方法實現緩存。

方式一(直接使用 Caffeine Api方式):

1、添加以上maven依賴。

2、配置一個Cache,通過構造者模式構建一個Cache對象,然后后續關於緩存的增刪查都是基於這個cache對象。這種方式使用的話是對代碼有侵入性的。

@Configuration public class CacheConfig { @Bean public Cache<String, Object> caffeineCache() { return Caffeine.newBuilder() // 設置最后一次寫入或訪問后經過固定時間過期
                .expireAfterWrite(60, TimeUnit.SECONDS) // 初始的緩存空間大小
                .initialCapacity(100) // 緩存的最大條數
                .maximumSize(1000) .build(); }

Caffeine 配置說明:

  • initialCapacity: 初始的緩存空間大小。

  • maximumSize: 緩存的最大數量。

  • maximumWeight: 緩存的最大權重。

  • expireAfterAccess: 最后一次讀或寫操作后經過指定時間過期。

  • expireAfterWrite: 最后一次寫操作后經過指定時間過期。

  • refreshAfterWrite: 創建緩存或者最近一次更新緩存后經過指定時間間隔,刷新緩存。

  • weakKeys: 打開key的弱引用。弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。

  • weakValues:打開value的弱引用。

  • softValues:打開value的軟引用。軟引用: 如果一個對象只具有軟引用,則內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。

  • recordStats:開發統計功能。

注意:

  • weakValues 和 softValues 不可以同時使用。

  • maximumSize 和 maximumWeight 不可以同時使用。

  • expireAfterWrite 和 expireAfterAccess 同事存在時,以 expireAfterWrite 為准。

3、使用Api

3.1、手動添加數據

@Autowired Cache<String, Object> caffeineCache; // 手動添加數據 cache.put("java-study", "java-study"); System.out.println(cache.getIfPresent("java-study"));

3.2、自動添加(自定義添加函數)

// 1.如果緩存中能查到,則直接返回 // 2.如果查不到,則從我們自定義的getValue方法獲取數據,並加入到緩存中
String val = cache.get("java-study", k -> getValue(k)); System.out.println(val); /** * 緩存中找不到,則會進入這個方法。一般是從數據庫獲取內容 * @param k * @return
*/
private static String getValue(String k) { return k + ":value"; }

3.3、刪除

  • 單個刪除:Cache.invalidate(key)

  • 批量刪除:Cache.invalidateAll(keys)

  • 刪除所有緩存項:Cache.invalidateAll

 

方式二(SpringCache + Caffeine):

1、maven依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.0.5</version>
</dependency>

2、需要在SpingBoot啟動類標上@EnableCaching注解

3、在application.yml配置我們的使用的緩存類型、過期時間、緩存策略等。

spring: profiles: active: dev cache: type: CAFFEINE caffeine: spec: maximumSize=500,expireAfterAccess=600s

如果我們不習慣使用這種方式的配置,當然我們也可以使用JavaConfig的配置方式來代替配置文件。

@Configuration public class CacheConfig { @Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() // 設置最后一次寫入或訪問后經過固定時間過期
                    .expireAfterAccess(600, TimeUnit.SECONDS) // 初始的緩存空間大小
                    .initialCapacity(100) // 緩存的最大條數
                    .maximumSize(500)); return cacheManager; }

4、接下來就是代碼中如何來使用這個緩存了

 @Override @CachePut(value = "user", key = "#userDTO.id") public UserDTO save(UserDTO userDTO) { userRepository.save(userDTO); return userDTO; } @Override @CacheEvict(value = "user", key = "#id")//2
    public void remove(Long id) { logger.info("刪除了id、key為" + id + "的數據緩存"); } @Override @Cacheable(value = "user",key = "#id") public UserDTO getUserById(Long id) { return userRepository.findOne(id); }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM