Spring Boot基礎教程:EhCache快取的使用

千鋒Python唐小強發表於2020-07-16

前面我們學會了如何使用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來儲存。而實際生產使用的時候,因為我們可能需要更多其他特性,往往就會採用其他快取框架,所以接下來我們會分別介紹幾個常用優秀快取的整合與使用。

使用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 {
        // 建立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中指定的版本號。


Spring Boot基礎教程:EhCache快取的使用

第二步:在src/main/resources目錄下建立:ehcache.xml


<
ehcache 
xmlns:xsi=
"

        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());
}

執行測試輸出可以得到:

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語句,所以是走的快取獲取

整合成功!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2705033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章