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


    上一篇我们学会了如何使用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中指定的版本号。

    第二步:在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,获得独家整理的学习资源和日常干货推送。
    本系列教程点击直达目录

  • 相关阅读:
    Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
    Vijos 1456 最小总代价 (状压dp)
    洛谷 P1313 计算系数 (二项式定理)
    洛谷 P1134 阶乘问题
    EINTR错误
    TCP和UDP协议的应用/参数查看
    BAT面经
    高级环境编程要看的
    UDP丢包和无序 问题的解决方法
    tcp/ip
  • 原文地址:https://www.cnblogs.com/didispace/p/13321552.html
Copyright © 2020-2023  润新知