<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Spring 3.1 中開始對快取提供支援,核心思路是對方法的快取,當開發者呼叫一個方法時,將方法的引數和返回值作為 key/value 快取起來,當再次呼叫改方法時,如果快取中有資料,就直接從快取中獲取,否則再去執行該方法。但是,Spring 中並未提供快取的實現,而是提供了一套快取 API ,開發者可以自由選擇快取的實現,目前 Spring Boot 支援的快取有如下幾種:
此處只介紹常用的快取實現 Ehcache 2.x 和 Redis,由於 Spring 早已將快取領域統一,因此無論使用哪種快取實現,不同的只是快取設定,開發者使用的快取註解是一致的(Spring 快取註解和各種快取實現的關係就像 JDBC 和各種資料庫驅動的關係一樣)。
Ehcache 快取在Java開發領域久負盛名,在Spring Boot 中,只需要一個組態檔就可以將 Ehcache 整合到專案中。步驟如下:
建立 Spring Boot 專案,新增 spring-boot-starter-cache 依賴以及 Ehcache 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
如果 Ehcache 的依賴存在,並且在 classpath 下有一個名為 echache.xml 的 Ehcache 組態檔,那麼 EhCacheCacheManager 將會自動作為快取的實現。因此,在 resources 目錄下建立 ehcache.xml 檔案作為 Ehcache 快取的組態檔,如下:
<ehcache> <diskStore path="java.io.tmpdir/cache"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" /> <!-- name:快取名稱 maxElementsInMemory:快取最大個數 eternal:快取物件是否永久有效。一旦設定了永久有效,timeout將不起作用 timeToIdleSeconds:快取物件在失效前允許閒置時間(秒),當eternal為false時生效 timeToLiveSeconds:快取物件在失效前允許存活的時間(秒),當eternal為false時生效 overflowToDisk:當記憶體中的物件數量達到maxElementsInMemory時, Ehcache 是否將物件寫到磁碟中 diskExpiryThreadIntervalSeconds:磁碟失效執行緒執行時間間隔 --> <cache name="book_cache" maxElementsInMemory="10000" eternal="true" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/> </ehcache>
這是一個常規的 Ehcache 組態檔,提供了兩個快取策略,一個是預設的,另一個名為 book_cache 。還有更為詳細的 Ehcache 設定,此處不再一一介紹。如果開發者想自定義 Ehcache 組態檔的名稱和位置,可以在 application.properties 中新增如下設定:
spring.cache.ehcache.config=classpath:ehcache2.xml
在專案的入口類新增 @EnableCaching 註解開啟快取,如下
@SpringBootApplication @EnableCaching public class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class, args); } }
Book
public class Book implements Serializable { private Integer id; private String name; private String author; @Override public String toString() { return "Book{" + "id=" + id + ", name='" + name + ''' + ", author='" + author + ''' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
BookDao
@Repository @CacheConfig(cacheNames = "book_cache") public class BookDao { @Cacheable public Book getBookById(Integer id) { System.out.println("getBookById"); Book book = new Book(); book.setId(id); book.setName("三國演義"); book.setAuthor("羅貫中"); return book; } @CachePut(key = "#book.id") public Book updateBookById(Book book) { System.out.println("updateBookById"); book.setName("三國演義2"); return book; } @CacheEvict(key = "#id") public void deleteBookById(Integer id) { System.out.println("deleteBookById"); } }
程式碼解釋:
在 BookDao 上新增 @CacheConfig 註解指明使用的快取名字,這個設定可選,若不使用 @CacheConfig ,則直接在 @Cacheable 註解中指明快取名字
在 getBookById 方法上新增 @Cacheable 註解表示對該方法進行快取,預設情況下,快取的key是方法的引數,快取的 value 是方法的返回值。當開發者在其他類中呼叫該方法時,首先會根據呼叫引數檢視快取中是否有相關資料,若有,則直接使用快取資料,該方法不會執行,否則執行該方法,執行成功後將返回值快取起來,但若是在當前類中呼叫該方法,則快取不會生效
@Cacheable 註解中還有一個屬性 condition 用來描述快取的執行時機,例如 @Cacheable(“#id%2==0”) 表示 id 對 2 取模為0時才進快取,否則不快取
如果開發者不想使用預設到的 key ,也可以像 updateBookById 和 deleteBookById 一樣自定義 key,@CachePut(key = “#book.id”) 表示快取的key 為引數book 物件中 id 的值,@CacheEvict(key = “#id”)表示快取的key為引數id。除了這種使用引數定義 key 的方式外,Spring 還提供了一個 root 物件用來生成 key ,如圖
| 屬性名稱 | 屬性描述 | 用法範例 |
| — | — | — |
| methodName | 當前方法名 | #root.methodName |
| method | 當前方法物件 | #root.method.name |
| caches | 當前方法使用的快取 | #root.caches[0].name |
| target | 當前被呼叫的物件 | #root.target |
| targetClass | 當前被呼叫的物件的class | #root.targetClass |
| args | 當前方法引數陣列 | #root.args[0] |
如果這些 key 不能滿足開發需求,開發者也可以自定義快取 key 的生成器 KeyGenerator,如下
@Component public class MyKeyGenerator implements KeyGenerator { @Override public Object generate(Object target, Method method, Object... params) { return Arrays.toString(params); } }
然後在 @Cacheable 註解中參照 MyKeyGenerator 範例即可
@Service @CacheConfig(cacheNames = "book_cache") public class BookDao { @Autowired MyKeyGenerator myKeyGenerator; @Cacheable(keyGenerator = "myKeyGenerator") public Book getBookById(Integer id) { System.out.println("getBookById"); Book book = new Book(); book.setId(id); book.setName("三國演義"); book.setAuthor("羅貫中"); return book; } @CachePut(key = "#book.id") public Book updateBookById(Book book) { System.out.println("updateBookById"); book.setName("三國演義2"); return book; } @CacheEvict(key = "#id") public void deleteBookById(Integer id) { System.out.println("deleteBookById"); } }
MyKeyGenerator 中的 generate 方法的引數分別是當前物件、當前請求的方法以及方法的引數,開發者可根據這些資訊組成一個新的 key 返回,返回值就是快取的 key。
對 Service 中的方法進行測試
@RunWith(SpringRunner.class) @SpringBootTest public class CacheApplicationTests { @Autowired BookDao bookDao; @Test public void contextLoads() { bookDao.deleteBookById(1); bookDao.getBookById(1); bookDao.getBookById(1); bookDao.deleteBookById(1); Book b3 = bookDao.getBookById(1); System.out.println("b3:"+b3); Book b = new Book(); b.setName("三國演義"); b.setAuthor("羅貫中"); b.setId(1); bookDao.updateBookById(b); Book b4 = bookDao.getBookById(1); System.out.println("b4:"+b4); } }
執行該方法,控制檯列印紀錄檔如下:
deleteBookById
getBookById
deleteBookById
getBookById
b3:Book{id=1, name='三國演義', author='羅貫中'}
updateBookById
b4:Book{id=1, name='三國演義2', author='羅貫中'}
為了防止來回測試快取的影響,這裡先執行刪除操作(同時也會刪除快取)。然後執行了一次查詢,正常列印,接著又執行了一次查詢沒列印(直接讀取的快取),然後執行刪除,接著再執行查詢正常列印(刪除操作也刪除了快取),再接著執行更新操作(同時更新了快取),最後再次查詢,列印更新後的資料。
到此這篇關於SpringBoot淺析快取機制之Ehcache 2.x應用的文章就介紹到這了,更多相關SpringBoot Ehcache 2.x內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45