• Spring Boot 缓存技术:Spring Boot:@Cacheable 与@CacheEvict



    1 @Cacheable

    @Cacheable 作用:把方法的返回值添加到 Ehcache 中做缓存

    Value 属性:指定一个 Ehcache 配置文件中的缓存策略,如果么有给定 value,name 则 表示使用默认的缓存策略。

    image


    Key 属性:给存储的值起个名称。在查询时如果有名称相同的,那么则知己从缓存中将 数据返回


    业务层


    @Override 
    @Cacheable(value="users",key="#pageable.pageSize")
     public Page<Users> findUserByPage(Pageable pageable) {
         return this.usersRepository.findAll(pageable);
    }


    测试代码

    @Test
    public void testFindUserByPage(){
    Pageable pageable = new PageRequest(0, 2);
     //第一次查询 
    System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
    //第二次查询 
    System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
    //第三次查询
     pageable = new PageRequest(1, 2);
    System.out.println(this.usersService.findUserByPage(pageable).getTotalElements()); }
    }


    @CacheEvict

    @CacheEvict 作用:清除缓存




    业务层


    package com.alan.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.stereotype.Service;
    
    import com.alan.dao.UsersRepository;
    import com.alan.pojo.Users;
    import com.alan.service.UsersService;
    /**
     * UsersService接口实现类
     *
     *
     */
    @Service
    public class UsersServiceImpl implements UsersService {
    
    	@Autowired
    	private UsersRepository usersRepository;
    
    	@Override
    	public List<Users> findUserAll() {
    		return this.usersRepository.findAll();
    	}
    
    	@Override
    	//@Cacheable:对当前查询的对象做缓存处理
    	@Cacheable(value="users" )
    	public Users findUserById(Integer id) {
    		return this.usersRepository.findOne(id);
    	}
    
    	@Override
    	@Cacheable(value = "users",key="#pageable.pageSize")
    	public Page<Users> findUserByPage(Pageable pageable) {
    		return this.usersRepository.findAll(pageable);
    	}
    
    	@Override
    	//@CacheEvict(value="users",allEntries=true) 清除缓存中以 users 缓 存策略缓存的对象
    	@CacheEvict(value="users",allEntries=true)
    	public void saveUsers(Users users) {
    		this.usersRepository.save(users);
    	}
    
    }
    

    测试代码


    @Test
    
    public void testFindAll(){
    
    //第一次查询 
    
    System.out.println(this.usersService.findUserAll().size());
    
    Users users = new Users();
    
    users.setAddress("南京");
    
    users.setAge(43);
    
    users.setName("朱七");
    
    this.usersService.saveUsers(users);
    
    //第二次查询 
    
    System.out.println(this.usersService.findUserAll().size());
    
    }
    


    image


    源代码:

    image


    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>1.5.10.RELEASE</version>
    	</parent>
    	<groupId>com.bjsxt</groupId>
    	<artifactId>23-spring-boot-ehcache</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    
    	<properties>
    		<java.version>1.7</java.version>
    		<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
    		<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
    	</properties>
    
    	<dependencies>
    		<!-- springBoot的启动器 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<!-- springBoot的启动器 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-thymeleaf</artifactId>
    		</dependency>
    
    		<!-- springBoot的启动器 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-jpa</artifactId>
    		</dependency>
    
    		<!-- 测试工具的启动器 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    		</dependency>
    
    		<!-- mysql -->
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    		</dependency>
    
    		<!-- druid连接池 -->
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>druid</artifactId>
    			<version>1.0.9</version>
    		</dependency>
    
    		<!-- Spring Boot缓存支持启动器 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-cache</artifactId>
    		</dependency>
    
    		<!-- Ehcache坐标 -->
    		<dependency>
    			<groupId>net.sf.ehcache</groupId>
    			<artifactId>ehcache</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>javax.xml.bind</groupId>
    			<artifactId>jaxb-api</artifactId>
    			<version>2.3.0</version>
    		</dependency>
    		<dependency>
    			<groupId>com.sun.xml.bind</groupId>
    			<artifactId>jaxb-impl</artifactId>
    			<version>2.3.0</version>
    		</dependency>
    		<dependency>
    			<groupId>com.sun.xml.bind</groupId>
    			<artifactId>jaxb-core</artifactId>
    			<version>2.3.0</version>
    		</dependency>
    		<dependency>
    			<groupId>javax.activation</groupId>
    			<artifactId>activation</artifactId>
    			<version>1.1.1</version>
    		</dependency>
    	</dependencies>
    </project>


    ehcache.xml

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    
        <diskStore path="java.io.tmpdir"/>
    
      <!--defaultCache:echcache的默认缓存策略  -->
        <defaultCache
                maxElementsInMemory="10000"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="120"
                maxElementsOnDisk="10000000"
                diskExpiryThreadIntervalSeconds="120"
                memoryStoreEvictionPolicy="LRU">
            <persistence strategy="localTempSwap"/>
        </defaultCache>
        <!-- 自定义缓存策略 -->
        <cache name="users"
                maxElementsInMemory="10000"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="120"
                maxElementsOnDisk="10000000"
                diskExpiryThreadIntervalSeconds="120"
                memoryStoreEvictionPolicy="LRU">
            <persistence strategy="localTempSwap"/>
        </cache>
    </ehcache>
    


    application.properties

    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/ssm
    spring.datasource.username=root
    spring.datasource.password=123456
    
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    
    spring.cache.ehcache.cofnig=ehcache.xml


    Table___mysqlSql

    create table `t_users` (
    	`id` double ,
    	`name` varchar (1500),
    	`age` double ,
    	`address` varchar (1560)
    );
    insert into `t_users` (`id`, `name`, `age`, `address`) values('1','张山','20','广东省佛山市顺德区');
    insert into `t_users` (`id`, `name`, `age`, `address`) values('2','李思','20','广东省广州市天河区');
    insert into `t_users` (`id`, `name`, `age`, `address`) values('3','王武','20','广东省佛山市南海区');
    insert into `t_users` (`id`, `name`, `age`, `address`) values('4','赵柳','20','广东省梅州市');
    insert into `t_users` (`id`, `name`, `age`, `address`) values('5','钱海','20','广东省韶关市');
    insert into `t_users` (`id`, `name`, `age`, `address`) values('6','孙思','20','广东省深证市');
    
    
    
    
    
    
    

    App

    package com.alan;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    
    
    @SpringBootApplication
    @EnableCaching
    public class App {
    
    	public static void main(String[] args) {
    		SpringApplication.run(App.class, args);
    	}
    }
    


    UsersServiceTest

    package com.alan.test;
    
    import com.alan.pojo.Users;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.alan.App;
    import com.alan.service.UsersService;
    
    import java.sql.SQLOutput;
    
    /**
     * UsersService测试
     *
     *
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes=App.class)
    public class UsersServiceTest {
    
    	@Autowired
    	private UsersService usersService;
    
    	@Test
    	public void testFindUserById(){
    		//第一次查询
    		System.out.println(this.usersService.findUserById(1));
    
    		//第二次查询
    		System.out.println(this.usersService.findUserById(1));
    	}
       @Test
    	public  void testFindUserByPage(){
    	   Pageable pageable=new PageRequest(0,2);
    	   //第一次查询
    	   System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
          //第二次查询
    	   System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
    	   //第三次查询
    	   pageable=new PageRequest(1,3);
    	   System.out.println(this.usersService.findUserByPage(pageable).getTotalElements());
    	}
    	@Test
    	public void testFindAll(){
    		//第一次查询
    		System.out.println(this.usersService.findUserAll().size());
    		Users users = new Users();
    		users.setAddress("南京");
    		users.setAge(43);
    		users.setName("朱七");
    		this.usersService.saveUsers(users);
    		//第二次查询
    		System.out.println(this.usersService.findUserAll().size());
    	}
    }
    


    UsersRepository

    package com.alan.dao;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import com.alan.pojo.Users;
    /**
     * 参数一 T :当前需要映射的实体
     * 参数二 ID :当前映射的实体中的OID的类型
     *
     */
    public interface UsersRepository extends JpaRepository<Users,Integer>{
    
    }
    


    Users

    package com.alan.pojo;
    
    import java.io.Serializable;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="t_users")
    public class Users implements Serializable {
    
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column(name="id")
    	private Integer id;
    
    	@Column(name="name")
    	private String name;
    
    	@Column(name="age")
    	private Integer age;
    
    	@Column(name="address")
    	private String address;
    
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Integer getAge() {
    		return age;
    	}
    
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    
    	public String getAddress() {
    		return address;
    	}
    
    	public void setAddress(String address) {
    		this.address = address;
    	}
    
    	@Override
    	public String toString() {
    		return "Users [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
    	}
    }
    


    UsersService

    package com.alan.service;
    
    import java.util.List;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    
    import com.alan.pojo.Users;
    
    public interface UsersService {
    
    	List<Users> findUserAll();
    	Users findUserById(Integer id);
    	Page<Users> findUserByPage(Pageable pageable);
    	void saveUsers(Users users);
    }
    


    UsersServiceImpl

    package com.alan.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.stereotype.Service;
    
    import com.alan.dao.UsersRepository;
    import com.alan.pojo.Users;
    import com.alan.service.UsersService;
    /**
     * UsersService接口实现类
     *
     *
     */
    @Service
    public class UsersServiceImpl implements UsersService {
    
    	@Autowired
    	private UsersRepository usersRepository;
    
    	@Override
    	public List<Users> findUserAll() {
    		return this.usersRepository.findAll();
    	}
    
    	@Override
    	//@Cacheable:对当前查询的对象做缓存处理
    	@Cacheable(value="users" )
    	public Users findUserById(Integer id) {
    		return this.usersRepository.findOne(id);
    	}
    
    	@Override
    	@Cacheable(value = "users",key="#pageable.pageSize")
    	public Page<Users> findUserByPage(Pageable pageable) {
    		return this.usersRepository.findAll(pageable);
    	}
    
    	@Override
    	//@CacheEvict(value="users",allEntries=true) 清除缓存中以 users 缓 存策略缓存的对象
    	@CacheEvict(value="users",allEntries=true)
    	public void saveUsers(Users users) {
    		this.usersRepository.save(users);
    	}
    
    }
    
    为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
    学问:纸上得来终觉浅,绝知此事要躬行
    为事:工欲善其事,必先利其器。
    态度:道阻且长,行则将至;行而不辍,未来可期
    转载请标注出处!
  • 相关阅读:
    【数据分析】6 点发的文章在博客园阅读量最高?
    canvas api 速记
    leetcode 315. Count of Smaller Numbers After Self 两种思路
    一道闭包题题解
    一道经典JS题(关于this)
    HTML5 — 让拖放变的流行起来
    你应该知道的25道Javascript面试题
    关于base64编码的原理和实现
    Python中的None
    Python字符编码和转码
  • 原文地址:https://www.cnblogs.com/ios9/p/14726659.html
Copyright © 2020-2023  润新知