Spring Boot 2.x基础教程:EhCache缓存的使用

上一篇咱们学会了如何使用Spring Boot使用进程内缓存在加速数据访问。可能你们会问,那咱们在Spring Boot中到底使用了什么缓存呢?java

在Spring Boot中经过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者:git

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

除了按顺序侦测外,咱们也能够经过配置属性spring.cache.type来强制指定。咱们也能够经过debug调试查看cacheManager对象的实例来判断当前使用了什么缓存。在上一篇中,咱们也展现了如何去查看当前使用状况。github

当咱们不指定具体其余第三方实现的时候,Spring Boot的Cache模块会使用ConcurrentHashMap来存储。而实际生产使用的时候,由于咱们可能须要更多其余特性,每每就会采用其余缓存框架,因此接下来咱们会分几篇分别介绍几个经常使用优秀缓存的整合与使用。spring

使用EhCache

本篇咱们将介绍如何在Spring Boot中使用EhCache进程内缓存。这里咱们将沿用上一篇的案例结果来进行改造,以实现EhCache的使用。缓存

先回顾下这个基础案例的三个部分:bash

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实体的数据访问实现(涵盖了缓存注解)spring-boot

@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中指定的版本号。

第二步:在src/main/resources目录下建立: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());
}

执行测试输出能够获得:

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语句,因此是走的缓存获取

整合成功!

代码示例

本文的相关例子能够查看下面仓库中的chapter5-2目录:

若是您以为本文不错,欢迎Star支持,您的关注是我坚持的动力!

本文首发: Spring Boot 2.x基础教程:EhCache缓存的使用,转载请注明出处。
欢迎关注个人公众号:程序猿DD,得到独家整理的学习资源和平常干货推送。
本系列教程 点击直达目录
相关文章
相关标签/搜索