SpringBoot非官方教程 | 第十三篇:springboot集成spring cache

轉(zhuǎn)載請(qǐng)標(biāo)明出處:
http://blog.csdn.net/forezp/article/details/71023614
本文出自方志朋的博客

本文介紹如何在springboot中使用默認(rèn)的spring cache,

聲明式緩存

Spring 定義 CacheManager 和 Cache 接口用來(lái)統(tǒng)一不同的緩存技術(shù)。例如 JCache、 EhCache、 Hazelcast、 Guava、 Redis 等。在使用 Spring 集成 Cache 的時(shí)候,我們需要注冊(cè)實(shí)現(xiàn)的 CacheManager 的 Bean。

Spring Boot 為我們自動(dòng)配置了 JcacheCacheConfiguration、 EhCacheCacheConfiguration、HazelcastCacheConfiguration、GuavaCacheConfiguration、RedisCacheConfiguration、SimpleCacheConfiguration 等。

默認(rèn)使用 ConcurrenMapCacheManager

在我們不使用其他第三方緩存依賴的時(shí)候,springboot自動(dòng)采用ConcurrenMapCacheManager作為緩存管理器。

環(huán)境依賴

在pom文件引入spring-boot-starter-cache環(huán)境依賴:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

創(chuàng)建一個(gè)book數(shù)據(jù)訪問(wèn)層

先創(chuàng)建一個(gè)實(shí)體類


public class Book {

   private String isbn;
   private String title;

   public Book(String isbn, String title) {
       this.isbn = isbn;
       this.title = title;
   }
 ....getter
 ....setter  

}

創(chuàng)建一個(gè)數(shù)據(jù)訪問(wèn)接口


public interface BookRepository {

    Book getByIsbn(String isbn);

}

這個(gè)你可以寫一個(gè)很復(fù)雜的數(shù)據(jù)查詢操作,比如操作mysql、nosql等等。為了演示這個(gè)栗子,我只做了一下線程的延遲操作,當(dāng)作是查詢數(shù)據(jù)庫(kù)的時(shí)間。

實(shí)現(xiàn)接口類:

@Component
public class SimpleBookRepository implements BookRepository {

    @Override
    
    public Book getByIsbn(String isbn) {
        simulateSlowService();
        return new Book(isbn, "Some book");
    }

    // Don't do this at home
    private void simulateSlowService() {
        try {
            long time = 3000L;
            Thread.sleep(time);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }

}

測(cè)試類

@Component
public class AppRunner implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);

    private final BookRepository bookRepository;

    public AppRunner(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    @Override
    public void run(String... args) throws Exception {
        logger.info(".... Fetching books");
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
        logger.info("isbn-4567 -->" + bookRepository.getByIsbn("isbn-4567"));
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
        logger.info("isbn-4567 -->" + bookRepository.getByIsbn("isbn-4567"));
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
    }

}

啟動(dòng)程序,你會(huì)發(fā)現(xiàn)程序在控制臺(tái)依次打印了:

2014-06-05 12:15:35.783 ... : .... Fetching books

2014-06-05 12:15:40.783 ... : isbn-1234 --> >Book{isbn='isbn-1234', title='Some book'}

2014-06-05 12:15:43.784 ... : isbn-1234 -->Book{isbn='isbn-1234', title='Some book'}

2014-06-05 12:15:46.786 ... : isbn-1234 -->Book{isbn='isbn-1234', title='Some book'}

你會(huì)發(fā)現(xiàn)程序依次3s打印一行日志。這時(shí)還沒(méi)開啟緩存技術(shù)。

開啟緩存技術(shù)

在程序的入口中加入@ EnableCaching開啟緩存技術(shù):

@SpringBootApplication
@EnableCaching
public class DemoApplication {

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

在需要緩存的地方加入@Cacheable注解,比如在getByIsbn()方法上加入@Cacheable("books"),這個(gè)方法就開啟了緩存策略,當(dāng)緩存有這個(gè)數(shù)據(jù)的時(shí)候,會(huì)直接返回?cái)?shù)據(jù),不會(huì)等待去查詢數(shù)據(jù)庫(kù)。

@Component
public class SimpleBookRepository implements BookRepository {

    @Override
    @Cacheable("books")
    public Book getByIsbn(String isbn) {
        simulateSlowService();
        return new Book(isbn, "Some book");
    }

    // Don't do this at home
    private void simulateSlowService() {
        try {
            long time = 3000L;
            Thread.sleep(time);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }

}

這時(shí)再啟動(dòng)程序,你會(huì)發(fā)現(xiàn)程序打?。?/p>

isbn-1234 -->Book{isbn='isbn-1234', title='Some book'}
2017-04-23 18:17:09.479 INFO 8054 --- [ main] forezp.AppRunner : isbn-4567 -->Book{isbn='isbn-4567', title='Some book'}
2017-04-23 18:17:09.480 INFO 8054 --- [ main] forezp.AppRunner : isbn-1234 -->Book{isbn='isbn-1234', title='Some book'}
2017-04-23 18:17:09.480 INFO 8054 --- [ main] forezp.AppRunner : isbn-4567 -->Book{isbn='isbn-4567', title='Some book'}
2017-04-23 18:17:09.481 INFO 8054 --- [ main] forezp.AppRunner : isbn-1234 -->Book{isbn='isbn-1234', title='Some book'}
2017-04-23 18:17:09.481 INFO 8054 --- [ main] forezp.AppRunner : isbn-1234 -->Book{isbn='isbn-1234', title='Some book'}

只有打印前面2個(gè)數(shù)據(jù),程序等了3s,之后的數(shù)據(jù)瞬間打印在控制臺(tái)上了,這說(shuō)明緩存起了作用。

源碼下載:https://github.com/forezp/SpringBootLearning

參考資料

caching

Spring Boot 揭秘與實(shí)戰(zhàn)(二) 數(shù)據(jù)緩存篇 - 快速入門

優(yōu)秀文章推薦:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,268評(píng)論 6 342
  • SPRING CONFIG (ConfigFileApplicationListener) spring.conf...
    JeGe閱讀 6,812評(píng)論 0 14
  • 最近一年,我有一個(gè)“偉大”的發(fā)明:我用讀書的聲音,取代了孩子們起床的鬧鈴。我習(xí)慣于用我的朗讀聲喚醒孩子,孩子也習(xí)慣...
    小壞蛋格瑞特閱讀 914評(píng)論 10 15
  • 清風(fēng)吹來(lái)我凌亂 風(fēng)沙肆掠卻讓我無(wú)比清晰 時(shí)間改變了我的思想 認(rèn)知讓我變得不在自我 生活讓我一點(diǎn)點(diǎn)忘記道德 一切只為...
    微呼吸閱讀 314評(píng)論 0 0

友情鏈接更多精彩內(nèi)容