ITPub博客

首页 > 应用开发 > IT综合 > Spring Boot基础教程:EhCache缓存的使用

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

原创 IT综合 作者:千锋Python唐小强 时间:2020-07-16 17:18:50 0 删除 编辑

前面我们学会了如何使用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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-14

  • 博文量
    995
  • 访问量
    621887