最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot緩存實(shí)戰(zhàn) Caffeine示例

 更新時(shí)間:2018年02月27日 14:07:40   作者:xiaolyuh  
本篇文章主要介紹了Spring Boot緩存實(shí)戰(zhàn) Caffeine示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Caffeine和Spring Boot集成

Caffeine是使用Java8對(duì)Guava緩存的重寫(xiě)版本,在Spring Boot 2.0中將取代Guava。如果出現(xiàn)Caffeine,CaffeineCacheManager將會(huì)自動(dòng)配置。使用spring.cache.cache-names屬性可以在啟動(dòng)時(shí)創(chuàng)建緩存,并可以通過(guò)以下配置進(jìn)行自定義(按順序):

  • spring.cache.caffeine.spec: 定義的特殊緩存
  • com.github.benmanes.caffeine.cache.CaffeineSpec: bean定義
  • com.github.benmanes.caffeine.cache.Caffeine: bean定義

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

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

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

引入依賴

<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>

開(kāi)啟緩存的支持

使用@EnableCaching注解讓Spring Boot開(kāi)啟對(duì)緩存的支持

@SpringBootApplication
@EnableCaching// 開(kāi)啟緩存,需要顯示的指定
public class SpringBootStudentCacheCaffeineApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringBootStudentCacheCaffeineApplication.class, args);
  }
}

配置文件

新增對(duì)緩存的特殊配置,如最大容量、過(guò)期時(shí)間等

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

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

/**
 * 必須要指定這個(gè)Bean,refreshAfterWrite=5s這個(gè)配置屬性才生效
 *
 * @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;
    }

    // 重寫(xiě)這個(gè)方法將oldValue值返回回去,進(jìn)而刷新緩存
    @Override
    public Object reload(Object key, Object oldValue) throws Exception {
      return oldValue;
    }
  };
  return cacheLoader;
}

Caffeine配置說(shuō)明:

  1. initialCapacity=[integer]: 初始的緩存空間大小
  2. maximumSize=[long]: 緩存的最大條數(shù)
  3. maximumWeight=[long]: 緩存的最大權(quán)重
  4. expireAfterAccess=[duration]: 最后一次寫(xiě)入或訪問(wèn)后經(jīng)過(guò)固定時(shí)間過(guò)期
  5. expireAfterWrite=[duration]: 最后一次寫(xiě)入后經(jīng)過(guò)固定時(shí)間過(guò)期
  6. refreshAfterWrite=[duration]: 創(chuàng)建緩存或者最近一次更新緩存后經(jīng)過(guò)固定的時(shí)間間隔,刷新緩存
  7. weakKeys: 打開(kāi)key的弱引用
  8. weakValues:打開(kāi)value的弱引用
  9. softValues:打開(kāi)value的軟引用
  10. recordStats:開(kāi)發(fā)統(tǒng)計(jì)功能

注意:

  1. expireAfterWrite和expireAfterAccess同事存在時(shí),以expireAfterWrite為準(zhǔn)。
  2. maximumSize和maximumWeight不可以同時(shí)使用
  3. weakValues和softValues不可以同時(shí)使用

示例代碼

/**
 * @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() + "數(shù)據(jù)做了緩存");
    return p;
  }

  @Override
  @CacheEvict(value = "people")//2
  public void remove(Long id) {
    logger.info("刪除了id、key為" + id + "的數(shù)據(jù)緩存");
    //這里不做實(shí)際刪除操作
  }

  /**
   * Cacheable
   * value:緩存key的前綴。
   * key:緩存key的后綴。
   * sync:設(shè)置如果緩存過(guò)期是不是只放一個(gè)請(qǐng)求去請(qǐng)求數(shù)據(jù)庫(kù),其他請(qǐng)求阻塞,默認(rèn)是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() + "數(shù)據(jù)做了緩存");
    return p;
  }

  @Override
  @Cacheable(value = "people1")//3
  public Person findOne1() {
    Person p = personRepository.findOne(2L);
    logger.info("為id、key為:" + p.getId() + "數(shù)據(jù)做了緩存");
    return p;
  }

  @Override
  @Cacheable(value = "people2")//3
  public Person findOne2(Person person) {
    Person p = personRepository.findOne(person.getId());
    logger.info("為id、key為:" + p.getId() + "數(shù)據(jù)做了緩存");
    return p;
  }
}

源碼:https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java利用File類創(chuàng)建文件的示例代碼

    Java利用File類創(chuàng)建文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java中的File類創(chuàng)建文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • MapTask階段shuffle源碼分析

    MapTask階段shuffle源碼分析

    今天小編就為大家分享一篇關(guān)于MapTask階段shuffle源碼分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • IDEA如何開(kāi)啟并配置services窗口

    IDEA如何開(kāi)啟并配置services窗口

    在使用IntelliJ IDEA時(shí),可能會(huì)遇到Services窗口不自動(dòng)彈出的情況,本文介紹了如何手動(dòng)開(kāi)啟Services窗口的簡(jiǎn)單步驟,首先,通過(guò)點(diǎn)擊菜單欄中的“視圖”->“工具窗口”->“服務(wù)”,或使用快捷鍵Alt+F8(注意快捷鍵可能存在沖突)來(lái)打開(kāi)Services窗口
    2024-10-10
  • Netty與NIO超詳細(xì)講解

    Netty與NIO超詳細(xì)講解

    Netty本質(zhì)上是一個(gè)NIO的框架,適用于服務(wù)器通訊相關(guān)的多種應(yīng)用場(chǎng)景。底層是NIO,NIO底層是Java?IO和網(wǎng)絡(luò)IO,再往下是TCP/IP協(xié)議,下面我們跟隨文章來(lái)詳細(xì)了解
    2022-08-08
  • Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解

    Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解

    這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法,在日常的開(kāi)發(fā)工作中,我們時(shí)常會(huì)遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺(tái)的銷售報(bào)表等等,需要的朋友可以參考下
    2023-08-08
  • Jenkins自動(dòng)部署Net Core過(guò)程圖解

    Jenkins自動(dòng)部署Net Core過(guò)程圖解

    這篇文章主要介紹了Jenkins自動(dòng)部署Net Core過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • springboot的logging.group日志分組方法源碼流程解析

    springboot的logging.group日志分組方法源碼流程解析

    這篇文章主要為大家介紹了springboot的logging.group日志分組方法源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • SpringBoot實(shí)現(xiàn)物品點(diǎn)贊功能

    SpringBoot實(shí)現(xiàn)物品點(diǎn)贊功能

    這篇文章主要介紹了SpringBoot物品點(diǎn)贊功能實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 詳解Mybatis是如何解析配置文件的

    詳解Mybatis是如何解析配置文件的

    這篇文章主要介紹了詳解Mybatis是如何解析配置文件的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能

    JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

台中市| 武清区| 大姚县| 珠海市| 集安市| 阿瓦提县| 乌拉特中旗| 文成县| 青田县| 隆德县| 安龙县| 随州市| 进贤县| 云南省| 桃园市| 宝丰县| 九寨沟县| 富裕县| 高邑县| 新巴尔虎右旗| 通河县| 邓州市| 财经| 诸城市| 南平市| 河西区| 右玉县| 广丰县| 富源县| 黄大仙区| 朝阳区| 东光县| 沧源| 清原| 房产| 岳普湖县| 咸阳市| 黔南| 随州市| 阿尔山市| 阳朔县|