激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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| 夜班护士在线观看 | 激情在线观看视频 | av7777777| 国产精品一区2区3区 | 中文字幕在线免费看 | 一区二区久久电影 | 国产免费观看一区二区三区 | 国产精品久久久久久影院8一贰佰 | av电影免费在线看 | 欧美一级淫片免费视频黄 | 色婷婷综合久久久中文一区二区 | 欧美一级视频在线观看 | 中文字幕在线播放一区 | 国产激情视频在线 | 成人三区四区 | 久久精品免费网站 | 欧美日韩在线播放 | 精品在线观看一区 | 国产一级毛片国产 | 99re热视频这里只精品 | 美女在线观看视频一区二区 | 99精品电影 | 国产一区二区三区网站 | 国产做爰| 久久观看免费视频 | 日日草日日干 | 久久国产免费视频 | 天天撸日日夜夜 | 久久久久久久久成人 | 国产精品成人一区二区三区电影毛片 | 成人午夜在线免费观看 | 91久久久久久久久久久久久 | 国产九色视频在线观看 | 91精品老司机 | 久精品国产 | japan护士性xxxⅹhd | 97中文字幕在线观看 | 亚洲射逼 |