轉(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
在我們不使用其他第三方緩存依賴(lài)的時(shí)候晓褪,springboot自動(dòng)采用ConcurrenMapCacheManager作為緩存管理器。
環(huán)境依賴(lài)
在pom文件引入spring-boot-starter-cache環(huán)境依賴(lài):
<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í)體類(lèi)
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è)你可以寫(xiě)一個(gè)很復(fù)雜的數(shù)據(jù)查詢(xún)操作综慎,比如操作mysql涣仿、nosql等等。為了演示這個(gè)栗子示惊,我只做了一下線程的延遲操作好港,當(dāng)作是查詢(xún)數(shù)據(jù)庫(kù)的時(shí)間。
實(shí)現(xiàn)接口類(lèi):
@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è)試類(lèi)
@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)開(kāi)啟緩存技術(shù)。
開(kāi)啟緩存技術(shù)
在程序的入口中加入@ EnableCaching開(kāi)啟緩存技術(shù):
@SpringBootApplication
@EnableCaching
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在需要緩存的地方加入@Cacheable注解录择,比如在getByIsbn()方法上加入@Cacheable("books")拔莱,這個(gè)方法就開(kāi)啟了緩存策略,當(dāng)緩存有這個(gè)數(shù)據(jù)的時(shí)候糊肠,會(huì)直接返回?cái)?shù)據(jù)辨宠,不會(huì)等待去查詢(xún)數(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)程序打余托巍:
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
參考資料
Spring Boot 揭秘與實(shí)戰(zhàn)(二) 數(shù)據(jù)緩存篇 - 快速入門(mén)
優(yōu)秀文章推薦:
- 更多springboot 教程:springBoot非官方教程 | 文章匯總
- 更多springcoud 教程:史上最簡(jiǎn)單的 SpringCloud 教程 | 文章匯總