Spring Boot 缓存技术:Spring Boot:@Cacheable 与@CacheEvict
1 @Cacheable
@Cacheable 作用:把方法的返回值添加到 Ehcache 中做缓存
Value 属性:指定一个 Ehcache 配置文件中的缓存策略,如果么有给定 value,name 则 表示使用默认的缓存策略。
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()); }
源代码:
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); } }
为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/