Spring Boot 2.x基礎教程:EhCache緩存的使用

上一篇我們學會了如何使用Spring Boot使用進程內緩存在加速數據訪問掸读⊥ξ铮可能大家會問涧黄,那我們在Spring Boot中到底使用了什么緩存呢源武?

在Spring Boot中通過@EnableCaching注解自動化配置合適的緩存管理器(CacheManager),Spring Boot根據下面的順序去偵測緩存提供者:

  • Generic
  • JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Simple

除了按順序偵測外舱污,我們也可以通過配置屬性spring.cache.type來強制指定呀舔。我們也可以通過debug調試查看cacheManager對象的實例來判斷當前使用了什么緩存。在上一篇中扩灯,我們也展示了如何去查看當前使用情況媚赖。

當我們不指定具體其他第三方實現的時候,Spring Boot的Cache模塊會使用ConcurrentHashMap來存儲珠插。而實際生產使用的時候惧磺,因為我們可能需要更多其他特性,往往就會采用其他緩存框架捻撑,所以接下來我們會分幾篇分別介紹幾個常用優(yōu)秀緩存的整合與使用磨隘。

使用EhCache

本篇我們將介紹如何在Spring Boot中使用EhCache進程內緩存。這里我們將沿用上一篇的案例結果來進行改造顾患,以實現EhCache的使用番捂。

先回顧下這個基礎案例的三個部分:

User實體的定義

@Entity
@Data
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

User實體的數據訪問實現(涵蓋了緩存注解)

@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {

    @Cacheable
    User findByName(String name);

}

測試驗證用例(涵蓋了CacheManager的注入,可用來觀察使用的緩存管理類)

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter51ApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private CacheManager cacheManager;

    @Test
    public void test() throws Exception {
        // 創(chuàng)建1條記錄
        userRepository.save(new User("AAA", 10));

        User u1 = userRepository.findByName("AAA");
        System.out.println("第一次查詢:" + u1.getAge());

        User u2 = userRepository.findByName("AAA");
        System.out.println("第二次查詢:" + u2.getAge());
    }

}

接下來我們通過下面的幾步操作江解,就可以輕松的把上面的緩存應用改成使用ehcache緩存管理设预。

第一步:在pom.xml中引入ehcache依賴

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

在Spring Boot的parent管理下,不需要指定具體版本犁河,會自動采用Spring Boot中指定的版本號鳖枕。

第二步:在src/main/resources目錄下創(chuàng)建:ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd">

    <cache name="users"
           maxEntriesLocalHeap="200"
           timeToLiveSeconds="600">
    </cache>

</ehcache>

完成上面的配置之后,再通過debug模式運行單元測試桨螺,觀察此時CacheManager已經是EhCacheManager實例宾符,說明EhCache開啟成功了∶鹣瑁或者在測試用例中加一句CacheManager的輸出魏烫,比如:

@Autowired
private CacheManager cacheManager;

@Test
public void test() throws Exception {
    System.out.println("CacheManager type : " + cacheManager.getClass());

    userRepository.save(new User("AAA", 10));

    User u1 = userRepository.findByName("AAA");
    System.out.println("第一次查詢:" + u1.getAge());

    User u2 = userRepository.findByName("AAA");
    System.out.println("第二次查詢:" + u2.getAge());
}

執(zhí)行測試輸出可以得到:

CacheManager type : class org.springframework.cache.ehcache.EhCacheCacheManager
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (age, name, id) values (?, ?, ?)
2020-07-14 18:09:28.465  INFO 58538 --- [           main] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第一次查詢:10
第二次查詢:10

可以看到:

  1. 第一行輸出的CacheManager type為org.springframework.cache.ehcache.EhCacheCacheManager,而不是上一篇中的ConcurrentHashMap了。
  2. 第二次查詢的時候则奥,沒有輸出SQL語句考润,所以是走的緩存獲取

整合成功!

代碼示例

本文的相關例子可以查看下面?zhèn)}庫中的chapter5-2目錄:

如果您覺得本文不錯读处,歡迎Star支持糊治,您的關注是我堅持的動力!

本文首發(fā):Spring Boot 2.x基礎教程:EhCache緩存的使用罚舱,轉載請注明出處井辜。
歡迎關注我的公眾號:程序猿DD,獲得獨家整理的學習資源和日常干貨推送管闷。
本系列教程點擊直達目錄

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末粥脚,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子包个,更是在濱河造成了極大的恐慌刷允,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碧囊,死亡現場離奇詭異树灶,居然都是意外死亡,警方通過查閱死者的電腦和手機糯而,發(fā)現死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門天通,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熄驼,你說我怎么就攤上這事像寒。” “怎么了瓜贾?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵诺祸,是天一觀的道長。 經常有香客問我祭芦,道長序臂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任实束,我火速辦了婚禮,結果婚禮上逊彭,老公的妹妹穿的比我還像新娘咸灿。我一直安慰自己,他們只是感情好侮叮,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布避矢。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪审胸。 梳的紋絲不亂的頭發(fā)上亥宿,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機與錄音砂沛,去河邊找鬼烫扼。 笑死,一個胖子當著我的面吹牛碍庵,可吹牛的內容都是我干的映企。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼静浴,長吁一口氣:“原來是場噩夢啊……” “哼堰氓!你這毒婦竟也來了?” 一聲冷哼從身側響起苹享,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤双絮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后得问,有當地人在樹林里發(fā)現了一具尸體囤攀,經...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年椭赋,在試婚紗的時候發(fā)現自己被綠了抚岗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡哪怔,死狀恐怖宣蔚,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情认境,我是刑警寧澤胚委,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站叉信,受9級特大地震影響亩冬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜硼身,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一硅急、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佳遂,春花似錦营袜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凤壁。三九已至,卻和暖如春跪另,著一層夾襖步出監(jiān)牢的瞬間拧抖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工免绿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唧席,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓针姿,卻偏偏與公主長得像袱吆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子距淫,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350