上一篇我們學會了如何使用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
可以看到:
- 第一行輸出的CacheManager type為
org.springframework.cache.ehcache.EhCacheCacheManager
,而不是上一篇中的ConcurrentHashMap
了。 - 第二次查詢的時候则奥,沒有輸出SQL語句考润,所以是走的緩存獲取
整合成功!
代碼示例
本文的相關例子可以查看下面?zhèn)}庫中的chapter5-2
目錄:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您覺得本文不錯读处,歡迎Star
支持糊治,您的關注是我堅持的動力!
本文首發(fā):Spring Boot 2.x基礎教程:EhCache緩存的使用罚舱,轉載請注明出處井辜。
歡迎關注我的公眾號:程序猿DD,獲得獨家整理的學習資源和日常干貨推送管闷。
本系列教程點擊直達目錄