Spring Boot 2.x基础教程:EhCache缓存的使用
发布日期:2021-06-29 21:51:14 浏览次数:3 分类:技术文章

本文共 3419 字,大约阅读时间需要 11 分钟。

点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

我们学会了如何使用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@NoArgsConstructorpublic 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
 {    @Cacheable    User findByName(String name);}

测试验证用例(涵盖了CacheManager的注入,可用来观察使用的缓存管理类)

@Slf4j@RunWith(SpringRunner.class)@SpringBootTestpublic 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依赖

    
net.sf.ehcache
    
ehcache

在Spring Boot的parent管理下,不需要指定具体版本,会自动采用Spring Boot中指定的版本号。

第二步:在src/main/resources目录下创建:ehcache.xml

    
    

完成上面的配置之后,再通过debug模式运行单元测试,观察此时CacheManager已经是EhCacheManager实例,说明EhCache开启成功了。或者在测试用例中加一句CacheManager的输出,比如:

@Autowiredprivate CacheManager cacheManager;@Testpublic 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.EhCacheCacheManagerHibernate: select next_val as id_val from hibernate_sequence for updateHibernate: 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 ASTQueryTranslatorFactoryHibernate: 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目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/

  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

往期推荐

立省 ¥100 ,到手仅 ¥99,即将 涨价至 ¥299

支持 3 天无理由退款,机不可失时不再来,赶紧加入吧 ~

转载地址:https://didispace-wx.blog.csdn.net/article/details/107399042 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:每日一皮:鼓励师招到了,原来是这样的...
下一篇:面试:从volatile说到i++的线程安全问题

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月26日 00时45分26秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章