本文介紹如何在springboot中使用默認的spring cache,
聲明式緩存
Spring 定義 CacheManager 和 Cache 接口用來統(tǒng)一不同的緩存技術。例如 JCache、 EhCache、 Hazelcast、 Guava、 Redis 等。在使用 Spring 集成 Cache 的時候,我們需要注冊實現(xiàn)的 CacheManager 的 Bean。
Spring Boot 為我們自動配置了 JcacheCacheConfiguration、 EhCacheCacheConfiguration、HazelcastCacheConfiguration、GuavaCacheConfiguration、RedisCacheConfiguration、SimpleCacheConfiguration 等。
默認使用 ConcurrenMapCacheManager
在我們不使用其他第三方緩存依賴的時候,springboot自動采用ConcurrenMapCacheManager作為緩存管理器。
環(huán)境依賴
在pom文件引入spring-boot-starter-cache環(huán)境依賴:
1
2
3
4
|
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-cache</ artifactId > </ dependency > |
創(chuàng)建一個book數(shù)據(jù)訪問層
先創(chuàng)建一個實體類
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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)建一個數(shù)據(jù)訪問接口
1
2
3
4
5
|
public interface BookRepository { Book getByIsbn(String isbn); } |
這個你可以寫一個很復雜的數(shù)據(jù)查詢操作,比如操作MySQL、nosql等等。為了演示這個栗子,我只做了一下線程的延遲操作,當作是查詢數(shù)據(jù)庫的時間。
實現(xiàn)接口類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@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); } } } |
測試類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@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" )); } } |
啟動程序,你會發(fā)現(xiàn)程序在控制臺依次打印了:
1
2
3
4
5
6
7
|
2014-06-05 12:15:35.783 … : …. Fetching books 2014-06-05 12:15:40.783 … : isbn-1234 –> >Book{isbn='isbn-1234', id="codetool">
你會發(fā)現(xiàn)程序依次3s打印一行日志。這時還沒開啟緩存技術。 開啟緩存技術 在程序的入口中加入@ EnableCaching開啟緩存技術:
在需要緩存的地方加入@Cacheable注解,比如在getByIsbn()方法上加入@Cacheable(“books”),這個方法就開啟了緩存策略,當緩存有這個數(shù)據(jù)的時候,會直接返回數(shù)據(jù),不會等待去查詢數(shù)據(jù)庫。
這時再啟動程序,你會發(fā)現(xiàn)程序打印:
|