一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Boot緩存實戰 Caffeine示例

Spring Boot緩存實戰 Caffeine示例

2021-04-07 14:28xiaolyuh Java教程

本篇文章主要介紹了Spring Boot緩存實戰 Caffeine示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

CaffeineSpring 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分鐘:

?
1
2
spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

除此之外,如果定義了com.github.benmanes.caffeine.cache.CacheLoader,它會自動關聯到CaffeineCacheManager。由于該CacheLoader將關聯被該緩存管理器管理的所有緩存,所以它必須定義為CacheLoader<Object, Object>,自動配置將忽略所有泛型類型。

引入依賴

?
1
2
3
4
5
6
7
8
9
<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開啟對緩存的支持

?
1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableCaching// 開啟緩存,需要顯示的指定
public class SpringBootStudentCacheCaffeineApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(SpringBootStudentCacheCaffeineApplication.class, args);
  }
}

配置文件

新增對緩存的特殊配置,如最大容量、過期時間等

?
1
2
spring.cache.cache-names=people
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s

如果使用了refreshAfterWrite配置還必須指定一個CacheLoader,如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * 必須要指定這個Bean,refreshAfterWrite=5s這個配置屬性才生效
 *
 * @return
 */
@Bean
public 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配置說明:

  1. initialCapacity=[integer]: 初始的緩存空間大小
  2. maximumSize=[long]: 緩存的最大條數
  3. maximumWeight=[long]: 緩存的最大權重
  4. expireAfterAccess=[duration]: 最后一次寫入或訪問后經過固定時間過期
  5. expireAfterWrite=[duration]: 最后一次寫入后經過固定時間過期
  6. refreshAfterWrite=[duration]: 創建緩存或者最近一次更新緩存后經過固定的時間間隔,刷新緩存
  7. weakKeys: 打開key的弱引用
  8. weakValues:打開value的弱引用
  9. softValues:打開value的軟引用
  10. recordStats:開發統計功能

注意:

  1. expireAfterWrite和expireAfterAccess同事存在時,以expireAfterWrite為準。
  2. maximumSize和maximumWeight不可以同時使用
  3. weakValues和softValues不可以同時使用

示例代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
 * @author yuhao.wang
 */
@Service
public 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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/c72fb0c787fc

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色图片小说 | 99精品视频一区在线观看miya | 国产japanese孕妇孕交 | 免费观看国产大片资源视频 | 我被黑人彻底征服的全文 | 亚洲精品一区二区观看 | 2021最新国产成人精品免费 | 免费一区二区视频 | 亚洲图片综合区 | 国产自一区 | 亚洲精品专区 | 国产欧美日韩亚洲精品区2345 | 欧美图片另类小说综合 | 国产精品免费观在线 | 日韩免费高清完整版 | 亚洲国产日韩制服在线观看 | 日本海鸣馆 | 国产精品久久久久久 | 美女被到爽流动漫 | 天堂资源在线www中文 | chinese男gay飞机同志 | 成人性色生活片免费网 | 亚洲欧美综合在线观看 | 深夜福利免费观看 | 日产精品一卡2卡三卡4乱码久久 | 好大好长好紧爽免费 | 91tv在线 | 极品 女神校花 露脸91 | 免费看黄色片的网站 | 免费视频片在线观看 | 亚洲羞羞裸色私人影院 | 99精品视频在线观看re | 国色天香社区在线视频免费观看 | 忘忧草研究院一二三 | 亚洲邪恶天堂影院在线观看 | 精品国产自在现线拍400部 | 精品一区二区视频 | 大胆私拍模特国模377 | 天海翼三级 | 免费国产网站 | 教室里的激情电影 |