欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Caffeine本地緩存項(xiàng)目實(shí)例

 更新時(shí)間:2023年10月09日 10:13:21   作者:閃耀的瞬間  
這篇文章主要介紹了Java中Caffeine本地緩存項(xiàng)目實(shí)例,Caffeine是一個(gè)高性能Java 緩存庫(kù),使用Java8對(duì)Guava緩存重寫(xiě)版本,在Spring Boot 2.0中將取代Guava,使用spring.cache.cache-names屬性可以在啟動(dòng)時(shí)創(chuàng)建緩存,需要的朋友可以參考下

前言

為什么需要本地緩存?在系統(tǒng)中,有些數(shù)據(jù),訪問(wèn)十分頻繁(例如數(shù)據(jù)字典數(shù)據(jù)、國(guó)家標(biāo)準(zhǔn)行政區(qū)域數(shù)據(jù)),往往把這些數(shù)據(jù)放入分布式緩存中,但為了減少網(wǎng)絡(luò)傳輸,加快響應(yīng)速度,緩存分布式緩存讀壓力,會(huì)把這些數(shù)據(jù)緩存到本地JVM中,大多是先取本地緩存中,再取分布式緩存中的數(shù)據(jù)

而Caffeine是一個(gè)高性能Java 緩存庫(kù),使用Java8對(duì)Guava緩存重寫(xiě)版本,在Spring Boot 2.0中將取代Guava。 使用spring.cache.cache-names屬性可以在啟動(dòng)時(shí)創(chuàng)建緩存

例如,以下application配置創(chuàng)建一個(gè)foo和bar緩存,最大數(shù)量為500,存活時(shí)間為10分鐘

spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=initialCapacity=10,maximumSize=500,expireAfterAccess=600s

還有一種代碼實(shí)現(xiàn)方式,我在項(xiàng)目中就是使用代碼方式,如何使用,請(qǐng)往下看

代碼實(shí)現(xiàn)

1.引入依賴(lài)

<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.2</version>
</dependency>

2.添加一個(gè)CaffeineConfig配置類(lèi),開(kāi)啟緩存@EnableCaching

@Configuration
@EnableCaching //開(kāi)啟緩存
public class CaffeineConfig {
    public static final int DEFAULT_MAXSIZE = 10000;
    public static final int DEFAULT_TTL = 600;
    /**
     * 定義cache名稱(chēng)、超時(shí)時(shí)長(zhǎng)(秒)、最大容量
     * 每個(gè)cache缺?。?0秒超時(shí)、最多緩存50000條數(shù)據(jù),需要修改可以在構(gòu)造方法的參數(shù)中指定。
     */
    public enum Caches{
        getUserById(600),          //有效期600秒
        listCustomers(7200,1000),  //有效期2個(gè)小時(shí) , 最大容量1000
        ;
        Caches() {
        }
        Caches(int ttl) {
            this.ttl = ttl;
        }
        Caches(int ttl, int maxSize) {
            this.ttl = ttl;
            this.maxSize = maxSize;
        }
        private int maxSize=DEFAULT_MAXSIZE;	//最大數(shù)量
        private int ttl=DEFAULT_TTL;		//過(guò)期時(shí)間(秒)
        public int getMaxSize() {
            return maxSize;
        }
        public int getTtl() {
            return ttl;
        }
    }
    /**
     * 創(chuàng)建基于Caffeine的Cache Manager
     * @return
     */
    @Bean
    @Primary
    public CacheManager caffeineCacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        ArrayList<CaffeineCache> caches = new ArrayList<CaffeineCache>();
        for(Caches c : Caches.values()){
            caches.add(new CaffeineCache(c.name(),
                    Caffeine.newBuilder().recordStats()
                            .expireAfterWrite(c.getTtl(), TimeUnit.SECONDS)
                            .maximumSize(c.getMaxSize())
                            .build())
            );
        }
        cacheManager.setCaches(caches);
        return cacheManager;
    }
}

3.創(chuàng)建控制器

創(chuàng)建一個(gè)控制器,使用本地緩存,注意@Cacheable,value與上面配置的值對(duì)應(yīng),key為參數(shù),sync=true表示同步,多個(gè)請(qǐng)求會(huì)被阻塞

@RestController
@RequestMapping("cache")
public class CacheController {
    @RequestMapping("listCustomers")
    @Cacheable( value = "listCustomers" , key = "#length", sync = true)
    public List<Customer> listCustomers(Long length){
        List<Customer> customers = new ArrayList<>();
        for(int i=1; i <= length ; i ++){
            Customer customer = new Customer(i, "zhuyu"+i, 20 + i, false);
            customers.add(customer);
        }
        return customers;
    }
    // 以第一個(gè)參數(shù)為key進(jìn)行緩存
    @Cacheable(value="users", key="#p0")
    public Long find(Long id) {
        return id;
    }
    // 以User中的id值為key進(jìn)行緩存
    @Cacheable(value="users", key="#user.id")
    public User find(User user) {
         return user;
    }
    // 以User中的id值為key,且 condition 條件滿足則緩存
    @Cacheable(value="users", key="#user.id", condition="#user.id%2==0")
    public User find(User user) {
       return user;
    }
}
  • @CacheEvict 是用來(lái)標(biāo)注清除緩存元素的,可在方法或類(lèi)上。當(dāng)標(biāo)記在一個(gè)類(lèi)上表示其中所有的方法的執(zhí)行都會(huì)觸發(fā)緩存的清除操作。
  • @CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語(yǔ)義與@Cacheable對(duì)應(yīng)的屬性類(lèi)似。即value表示清除操作是發(fā)生在哪些Cache上的(對(duì)應(yīng)Cache的名稱(chēng));key表示需要清除的是哪個(gè)key,如未指定則會(huì)使用默認(rèn)策略生成的key;condition表示清除操作發(fā)生的條件
  // allEntries表示是否需要清除緩存中的所有元素。默認(rèn)為false,當(dāng)allEntries為true時(shí),清除所有的元素
  @CacheEvict(value="user", allEntries=true)
  public void delete(Integer id) {
      System.out.println(id);
  }

4.啟動(dòng)項(xiàng)目

訪問(wèn)上面的方法,效果如下,第一次處理時(shí)間為 110ms ,再刷新幾次頁(yè)面只要 1ms,說(shuō)明后面的請(qǐng)求從本地緩存中獲取數(shù)據(jù),并返回了

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

使用本地緩存可以加快頁(yè)面響應(yīng)速度,緩存分布式緩存讀壓力,大量、高并發(fā)請(qǐng)求的網(wǎng)站比較適用

Caffeine配置說(shuō)明

  • initialCapacity=[integer]: 初始的緩存空間大小
  • maximumSize=[long]: 緩存的最大條數(shù)
  • maximumWeight=[long]: 緩存的最大權(quán)重
  • expireAfterAccess=[duration]: 最后一次寫(xiě)入或訪問(wèn)后經(jīng)過(guò)固定時(shí)間過(guò)期
  • expireAfterWrite=[duration]: 最后一次寫(xiě)入后經(jīng)過(guò)固定時(shí)間過(guò)期
  • refreshAfterWrite=[duration]: 創(chuàng)建緩存或者最近一次更新緩存后經(jīng)過(guò)固定的時(shí)間間隔,刷新緩存
  • recordStats:開(kāi)發(fā)統(tǒng)計(jì)功能

注意:

  • expireAfterWrite和expireAfterAccess同時(shí)存在時(shí),以expireAfterWrite為準(zhǔn)。
  • maximumSize和maximumWeight不可以同時(shí)使用

到此這篇關(guān)于Java中Caffeine本地緩存項(xiàng)目實(shí)例的文章就介紹到這了,更多相關(guān)Caffeine本地緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中ArrayList和Vector的區(qū)別

    Java中ArrayList和Vector的區(qū)別

    本文主要介紹了Java中ArrayList和Vector的區(qū)別,包括線程安全性、性能、同步機(jī)制、擴(kuò)容機(jī)制、遍歷方式等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-11-11
  • java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲

    java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲

    這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • java處理日期的工具類(lèi)DateUtil

    java處理日期的工具類(lèi)DateUtil

    這篇文章主要為大家詳細(xì)介紹了java處理日期的工具類(lèi)DateUtil,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • springboot自動(dòng)配置原理以及spring.factories文件的作用詳解

    springboot自動(dòng)配置原理以及spring.factories文件的作用詳解

    這篇文章主要介紹了springboot自動(dòng)配置原理以及spring.factories文件的作用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • idea快速生成代碼配置的方法示例

    idea快速生成代碼配置的方法示例

    本文主要介紹了idea快速生成代碼配置的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringBoot?實(shí)現(xiàn)動(dòng)態(tài)添加定時(shí)任務(wù)功能

    SpringBoot?實(shí)現(xiàn)動(dòng)態(tài)添加定時(shí)任務(wù)功能

    這篇文章主要介紹了SpringBoot?動(dòng)態(tài)添加定時(shí)任務(wù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Mybatis常用注解中的SQL注入實(shí)例詳解

    Mybatis常用注解中的SQL注入實(shí)例詳解

    MyBatis是一款優(yōu)秀的持久層框架,它支持定制化 SQL(靈活)、存儲(chǔ)過(guò)程(PLSQL模塊化的組件,數(shù)據(jù)庫(kù)的一部分)以及高級(jí)映射(表映射為Bean也可以將Bean映射為表),下面這篇文章主要給大家介紹了關(guān)于Mybatis常用注解中的SQL注入的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作

    ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作

    這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Java讀取TXT文件內(nèi)容的方法

    Java讀取TXT文件內(nèi)容的方法

    本篇文章主要介紹了Java讀取TXT文件內(nèi)容的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java后臺(tái)返回和處理JSon數(shù)據(jù)的方法步驟

    Java后臺(tái)返回和處理JSon數(shù)據(jù)的方法步驟

    這篇文章主要介紹了Java后臺(tái)返回和處理JSon數(shù)據(jù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論