作者:方誌朋
鏈接:https://www.jianshu.com/p/b2d681b40c2f
SpringBoot教程|第十三篇:springboot集成spring cache

本文介紹如何在springboot中使用默認的spring cache,

聲明式緩存

Spring 定義 CacheManager 和 Cache 接口用來統一不同的緩存技術。例如 JCache、 EhCache、 Hazelcast、 Guava、 Redis 等。在使用 Spring 集成 Cache 的時候,我們需要註冊實現的 CacheManager 的 Bean。

Spring Boot 爲我們自動配置了 JcacheCacheConfiguration、 EhCacheCacheConfiguration、HazelcastCacheConfiguration、GuavaCacheConfiguration、RedisCacheConfiguration、SimpleCacheConfiguration 等。

默認使用 ConcurrenMapCacheManager

在我們不使用其他第三方緩存依賴的時候,springboot自動採用ConcurrenMapCacheManager作爲緩存管理器。

環境依賴

在pom文件引入spring-boot-starter-cache環境依賴:


org.springframework.boot
spring-boot-starter-cache

創建一個book數據訪問層

先創建一個實體類


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

創建一個數據訪問接口


public interface BookRepository {
Book getByIsbn(String isbn);
}

這個你可以寫一個很複雜的數據查詢操作,比如操作mysql、nosql等等。爲了演示這個栗子,我只做了一下線程的延遲操作,當作是查詢數據庫的時間。

實現接口類:

@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);
}
}
}

測試類

@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"));
}
}

啓動程序,你會發現程序在控制檯依次打印了:

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

你會發現程序依次3s打印一行日誌。這時還沒開啓緩存技術。

開啓緩存技術

在程序的入口中加入@ EnableCaching開啓緩存技術:

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

在需要緩存的地方加入@Cacheable註解,比如在getByIsbn()方法上加入@Cacheable("books"),這個方法就開啓了緩存策略,當緩存有這個數據的時候,會直接返回數據,不會等待去查詢數據庫。

@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);
}
}
}

這時再啓動程序,你會發現程序打印:

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個數據,程序等了3s,之後的數據瞬間打印在控制檯上了,這說明緩存起了作用。

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

相關文章