美文网首页
SpringBoot整合ehcache

SpringBoot整合ehcache

作者: CodePandaes | 来源:发表于2020-03-11 17:04 被阅读0次

    简介

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

    ehcache 和 redis 比较

    ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
    redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。
    如果是单个应用或者对缓存访问要求很高的应用,用ehcache。
    如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

    注解

    Spring对缓存的支持类似于对事务的支持,相当于定义了切点,然后使用Aop技术在这个方法的调用前、调用后获取方法的入参和返回值,进而实现了缓存的逻辑。
    主要注解:
    @Cacheable
    表明所修饰的方法是可以缓存的:当第一次调用这个方法时,它的结果会被缓存下来,在缓存的有效时间内,以后访问这个方法都直接返回缓存结果,不再执行方法中的代码段。
    这个注解可以用condition属性来设置条件,如果不满足条件,就不使用缓存能力,直接执行方法。
    可以使用key属性来指定key的生成规则。

    @CachePut
    与@Cacheable不同,@CachePut不仅会缓存方法的结果,还会执行方法的代码段。它支持的属性和用法都与@Cacheable一致。一个缓存后就不执行代码了,一个还要执行)

    @CacheEvict
    与@Cacheable功能相反,@CacheEvict表明所修饰的方法是用来删除失效或无用的缓存数据。
    value:缓存位置名称,不能为空,同上
    key:缓存的key,默认为空,同上
    condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL
    allEntries:true表示清除value中的全部缓存,默认为false

    准备

    准备好新建数据库和表结构,并插入数据,sql脚本如下

    /*
    SQLyog Ultimate v12.08 (64 bit)
    MySQL - 5.6.42 : Database - spring_cache
    *********************************************************************
    */
    
    
    /*!40101 SET NAMES utf8 */;
    
    /*!40101 SET SQL_MODE=''*/;
    
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    CREATE DATABASE /*!32312 IF NOT EXISTS*/`spring_cache` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
    
    USE `spring_cache`;
    
    /*Table structure for table `employee` */
    
    DROP TABLE IF EXISTS `employee`;
    
    CREATE TABLE `employee` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `lastName` varchar(255) DEFAULT NULL,
      `email` varchar(255) DEFAULT NULL,
      `gender` int(2) DEFAULT NULL,
      `d_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
    
    /*Data for the table `employee` */
    
    insert  into `employee`(`id`,`lastName`,`email`,`gender`,`d_id`) values (1,'zhangsan','1234@qq.com',1,1);
    
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    
    

    搭建工程

    SpringBoot + 注解版Mybatis + Mysql
    pom.xml文件依赖如下

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.1</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    

    配置文件application.yml中数据库连接和开启驼峰命名

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/spring_cache?serverTimezone=UTC
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: root
        #开启驼峰命名法
    mybatis:
      configuration:
        map-underscore-to-camel-case: true
        #开启日志打印
    #com.eh.springbootcache: 目录
    logging:
      level:
        com:
          eh:
            springbootcache:
              mapper: debug
    

    添加实体类employee

    public class Employee {
        private Integer id;
        private String lastName;
        private Integer gender;
        private String email;
        private Integer dId;
    
        public Employee() {
        }
    
        public Employee(Integer id, String lastName, Integer gender, String email, Integer dId) {
            this.id = id;
            this.lastName = lastName;
            this.gender = gender;
            this.email = email;
            this.dId = dId;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public Integer getGender() {
            return gender;
        }
    
        public void setGender(Integer gender) {
            this.gender = gender;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public Integer getdId() {
            return dId;
        }
    
        public void setdId(Integer dId) {
            this.dId = dId;
        }
    }
    
    

    添加dao层EmployeeMapper

    public interface EmployeeMapper {
        @Select("SELECT * FROM employee WHERE id = #{id}")
        public Employee getEmpById(Integer id);
    }
    
    

    添加service层

    @Service
    public class EmployeeService {
    
        @Resource
        EmployeeMapper employeeMapper;
    
        //将方法的运行结果进行缓存,再次查询就可以从缓存中取,不用调用该方法
        @Cacheable(value = "{emp}", condition = "#id>0")
        public Employee getEmp(Integer id) {
            System.out.println("查询员工" + id);
            return employeeMapper.getEmpById(id);
        }
    }
    

    添加EmployeeController

    @RestController
    public class EmployeeController {
    
        @Resource
        private EmployeeService employeeService;
    
        @GetMapping("/emp/{id}")
        public Employee getEmp(@PathVariable("id") Integer id) {
            return employeeService.getEmp(id);
        }
    }
    
    

    开启注解缓存,扫描EmployeeMapper所在包

    @MapperScan("com.eh.springbootcache.mapper")
    @SpringBootApplication
    @EnableCaching   //开启基于注解的缓存
    public class SpringBootCacheApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootCacheApplication.class, args);
        }
    
    }
    

    浏览器输入localhost:8080/emp/1第一次查询数据,console输出如下

    清空console,第二次则使用缓存,显示结果,如下

    @CachePut和@CacheEvict的用法可自行测试

    相关文章

      网友评论

          本文标题:SpringBoot整合ehcache

          本文链接:https://www.haomeiwen.com/subject/iomcjhtx.html