緩存是每一個系統(tǒng)都應(yīng)該考慮的功能惋嚎,它用來加速系統(tǒng)的訪問杠氢,提升系統(tǒng)的性能。
比如說一些經(jīng)常需要訪問的高頻熱點數(shù)據(jù)另伍,例如:電商網(wǎng)站的商品信息鼻百。 如果商品信息存儲在數(shù)據(jù)庫中,每次來查詢商品信息都要來查詢數(shù)據(jù)庫的話摆尝,這樣的操作耗時太大温艇,代價也相對太大。 此時我們可以引入一個緩存中間件堕汞,將商品信息存放在緩存中勺爱,就不需要直接來查詢數(shù)據(jù)庫了。先來查詢緩存中是否有該商品的信息讯检,如果有就直接拿來使用琐鲁;如果沒有的話,然后再去數(shù)據(jù)庫中查詢人灼,然后再將數(shù)據(jù)放回到緩存围段。因為應(yīng)用程序與緩存的交互是非常快的投放,這樣的話就可以大大減緩數(shù)據(jù)庫的壓力奈泪。再比如:一些臨時性的數(shù)據(jù),為某個用戶的手機號發(fā)送了驗證碼,三分鐘有效段磨,過期刪除取逾。如果將這些數(shù)據(jù)存儲在數(shù)據(jù)庫中耗绿,也是非常有壓力的苹支。我們也可以將這些數(shù)據(jù)存儲在緩存中間件中。系統(tǒng)直接從緩存中獲取數(shù)據(jù)即可误阻。
緩存在系統(tǒng)中用的還是非常多的债蜜。所以為了統(tǒng)一緩存的開發(fā)規(guī)范,提升系統(tǒng)的擴展性究反。J2EE 發(fā)布了 JSR-107規(guī)范寻定。主要提供了5個接口。
什么是JSR-107
JSR是Java Specification Requests的縮寫精耐,意思是Java規(guī)范提案狼速。2012年10月26日JSR規(guī)范委員會發(fā)布了JSR 107(JCache API的首個早期草案)。JCache 規(guī)范定義了一種對Java對象臨時在內(nèi)存中進行緩存的方法卦停,包括對象的創(chuàng)建向胡、共享訪問、假脫機(spooling)惊完、失效僵芹、各JVM的一致性等,可被用于緩存JSP內(nèi)最經(jīng)常讀取的數(shù)據(jù)小槐。
Java Caching 定義了5個核心接口拇派,分別是CachingProvider、CacheManager凿跳、Cache件豌、Entry 和 Expiry。
接口 | 介紹 |
---|---|
CachingProvider | 緩存提供者控嗜。 定義了創(chuàng)建苟径、配置、獲取躬审、管理和控制多個 CacheManager棘街。一個應(yīng)用可以在運行期訪問多個 CachingProvider。 |
CacheManager | 緩存管理器承边。 定義了創(chuàng)建遭殉、配置、獲取博助、管理和控制多個唯一命名的 Cache险污,這些 Cache 存在于 CacheManager 的上下文中。一個 CacheManager 僅被一個 CachingProvider 所擁有。 |
Cache | 緩存組件蛔糯。 是一個類似 Map 的數(shù)據(jù)結(jié)構(gòu)并臨時存儲以 key 為索引的值拯腮。一個 Cache 僅被一個 CacheManager 所擁有。 |
Entry | 鍵值對蚁飒。 是一個存儲在 Cache 中的 key-value 對动壤。 |
Expiry | 有效期。 每一個存儲在 Cache 中的條目有一個定義的有效期淮逻。一旦超過這個時間琼懊,條目為過期的狀態(tài)。一旦過期爬早,條目將不可訪問哼丈、更新和刪除。緩存有效期可以通過 ExpiryPolicy 設(shè)置筛严。 |
應(yīng)用調(diào)用緩存圖示
應(yīng)用來調(diào)用緩存醉旦,首先會先調(diào)用CachingProvider(緩存提供者),緩存提供者管理了多個CacheManager(緩存管理器)桨啃,緩存管理器中才真正的Cache緩存车胡。緩存管理器中可以管理不同類型的緩存,比如:Redis优幸、EhCache 等吨拍。
在具體緩存組件中,我們還可以設(shè)置不同模塊的緩存网杆,比如:Redis 中我們可以來緩存 商品信息羹饰、熱點數(shù)據(jù) 等不同模塊數(shù)據(jù),每個緩存都是Entry<K,V>鍵值對類型碳却。并且我們可以對緩存設(shè)置Expiry過期時間队秩,指定緩存存活的時間。
緩存在我們應(yīng)用開發(fā)中的調(diào)用步驟昼浦,如下圖所示:
JSR-107規(guī)范使用
在項目中使用 JSR-107規(guī)范馍资,首先需要導(dǎo)入 Maven 依賴:
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
該包下提供了 CachingProvider 接口,我們可以通過 getCacheManager()方式來獲取 CacheManager关噪。 CacheManger 通過 createCache()鸟蟹、getCache() 方法來直接獲取到緩存Cache,緩存的具體增刪改查操作使兔,就在 Cache 組件中建钥。
總結(jié)
JSR-107 作為一個 Java 規(guī)范,它定義的都是一些接口虐沥,類似于 JDBC 規(guī)范熊经。它的好處在于:我們直接面向接口編程泽艘,需要用到哪種緩存的實現(xiàn),我們來直接引入該緩存實現(xiàn)即可镐依,系統(tǒng)就能運行起來匹涮。 然而:并不是市面上所有的緩存組件都提供了 JSR-107 規(guī)范的實現(xiàn)。如果我們選擇的緩存中間件沒有實現(xiàn) JSR-107 規(guī)范接口槐壳,那么就需要自己來實現(xiàn)咯然低。整個過程 API 開發(fā)也比較麻煩,所以 JSR-107 規(guī)范在我們的日常開發(fā)中用的還是比較少宏粤。