Spring Boot緩衝實戰 Caffeine樣本,springcaffeine
Caffeine和Spring Boot整合
Caffeine是使用Java8對Guava緩衝的重寫版本,在Spring Boot 2.0中將取代Guava。如果出現Caffeine,CaffeineCacheManager將會自動設定。使用spring.cache.cache-names屬性可以在啟動時建立緩衝,並可以通過以下配置進行自訂(按順序):
- spring.cache.caffeine.spec: 定義的特殊緩衝
- com.github.benmanes.caffeine.cache.CaffeineSpec: bean定義
- com.github.benmanes.caffeine.cache.Caffeine: bean定義
例如,以下配置建立一個foo和bar緩衝,最大數量為500,存活時間為10分鐘:
spring.cache.cache-names=foo,barspring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
除此之外,如果定義了com.github.benmanes.caffeine.cache.CacheLoader,它會自動關聯到CaffeineCacheManager。由於該CacheLoader將關聯被該緩衝管理器管理的所有緩衝,所以它必須定義為CacheLoader<Object, Object>,自動設定將忽略所有泛型型別。
引入依賴
<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>2.6.0</version></dependency>
開啟緩衝的支援
使用@EnableCaching註解讓Spring Boot開啟對緩衝的支援
@SpringBootApplication@EnableCaching// 開啟緩衝,需要顯示的指定public class SpringBootStudentCacheCaffeineApplication { public static void main(String[] args) { SpringApplication.run(SpringBootStudentCacheCaffeineApplication.class, args); }}
設定檔
新增對緩衝的特殊配置,如最大容量、到期時間等
spring.cache.cache-names=peoplespring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s
如果使用了refreshAfterWrite配置還必須指定一個CacheLoader,如:
/** * 必須要指定這個Bean,refreshAfterWrite=5s這個配置屬性才生效 * * @return */@Beanpublic CacheLoader<Object, Object> cacheLoader() { CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() { @Override public Object load(Object key) throws Exception { return null; } // 重寫這個方法將oldValue值返回回去,進而重新整理緩衝 @Override public Object reload(Object key, Object oldValue) throws Exception { return oldValue; } }; return cacheLoader;}
Caffeine配置說明:
- initialCapacity=[integer]: 初始的緩衝空間大小
- maximumSize=[long]: 緩衝的最大條數
- maximumWeight=[long]: 緩衝的最大權重
- expireAfterAccess=[duration]: 最後一次寫入或訪問後經過固定時間到期
- expireAfterWrite=[duration]: 最後一次寫入後經過固定時間到期
- refreshAfterWrite=[duration]: 建立緩衝或者最近一次更新緩衝後經過固定的時間間隔,重新整理緩衝
- weakKeys: 開啟key的弱引用
- weakValues:開啟value的弱引用
- softValues:開啟value的軟引用
- recordStats:開發統計功能
注意:
- expireAfterWrite和expireAfterAccess同事存在時,以expireAfterWrite為準。
- maximumSize和maximumWeight不可以同時使用
- weakValues和softValues不可以同時使用
範例程式碼
/** * @author yuhao.wang */@Servicepublic class PersonServiceImpl implements PersonService { private static final Logger logger = LoggerFactory.getLogger(PersonServiceImpl.class); @Autowired PersonRepository personRepository; @Override @CachePut(value = "people", key = "#person.id") public Person save(Person person) { Person p = personRepository.save(person); logger.info("為id、key為:" + p.getId() + "資料做了緩衝"); return p; } @Override @CacheEvict(value = "people")//2 public void remove(Long id) { logger.info("刪除了id、key為" + id + "的資料緩衝"); //這裡不做實際刪除操作 } /** * Cacheable * value:緩衝key的首碼。 * key:緩衝key的尾碼。 * sync:設定如果緩衝到期是不是只放一個請求去請求資料庫,其他請求阻塞,預設是false。 */ @Override @Cacheable(value = "people", key = "#person.id", sync = true) public Person findOne(Person person, String a, String[] b, List<Long> c) { Person p = personRepository.findOne(person.getId()); logger.info("為id、key為:" + p.getId() + "資料做了緩衝"); return p; } @Override @Cacheable(value = "people1")//3 public Person findOne1() { Person p = personRepository.findOne(2L); logger.info("為id、key為:" + p.getId() + "資料做了緩衝"); return p; } @Override @Cacheable(value = "people2")//3 public Person findOne2(Person person) { Person p = personRepository.findOne(person.getId()); logger.info("為id、key為:" + p.getId() + "資料做了緩衝"); return p; }}
源碼:https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。