SpringBoot(七) SpringBoot中的缓存机制

随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一。Spring3开始提供了强大的基于注解的缓存支持,可以通过注解配置方式低侵入的给原有Spring应用增加缓存功能,提高数据访问性能。SpringBoot中的Cache缓存1、基本概念Spring从3.1开始定义了org.springframew...

随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一。Spring 3开始提供了强大的基于注解的缓存支持,可以通过注解配置方式低侵入的给原有Spring应用增加缓存功能,提高数据访问性能。

SpringBoot中的Cache缓存

1、基本概念

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;同时支持JCache(JSR-107)注解。

Cache缓存接口,定义缓存操作,实现有:RedisCache、EhCacheCache、ConcurrentMapCache等
CacheManager缓存管理器,管理各种缓存(Cache)组件
@Cacheable针对方法配置,根据方法的请求参数对其结果进行缓存
@CacheEvict清空缓存
@CachePut保证方法被调用,又希望结果被缓存 update,调用,将信息更新缓存
@EnableCaching开启基于注解的缓存
KeyGenerator缓存数据时key生成的策略
serialize缓存数据时value序列化策略

2、整合项目

1、新建一个SpringBoot1.5 web mysql mybatis cache

2、编写配置文件,连接Mysql

spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://192.168.1.125:3306/test01spring.datasource.username=rootspring.datasource.password=rootmybatis.configuration.map-underscore-to-camel-case=trueserver.port=9000

3、创建JaveBean实例

public class Employee { private Integer id; private String lastName; private String gender; private String email; private Integer 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 String getGender() {  return gender; } public void setGender(String 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; } @Override public String toString() {  return "Employee{""id="id", lastName='"lastName'\''", gender='"gender'\''", email='"email'\''", dId="dId'}'; }}

4、创建mapper接口映射数据库,并访问数据库中的数据

import com.wdjr.cache.bean.Employee;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update;@Mapperpublic interface EmployeeMapper { @Select("SELECT * FROM employee WHERE id = #{id}") public Employee getEmpById(Integer id); @Update("UPDATE employee SET lastName=#{lastName},email=#{email},gender=#{gender},d_id=#{dId} WHERE id=#{id}") public void updateEmp(Employee employee);}

5、在pom.xml中引入cache依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId></dependency>

6、主程序添加注解MapperScan,并且使用@EnableCaching,开启缓存功能

import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cache.annotation.EnableCaching;@EnableCaching@MapperScan("com.wdjr.cache.mapper")@SpringBootApplicationpublic class Springboot01CacheApplication { public static void main(String[] args) {  SpringApplication.run(Springboot01CacheApplication.class, args); }}

7、编写service,来具体实现mapper中的方法,使用@Cacheable增加缓存

import com.wdjr.cache.bean.Employee;import com.wdjr.cache.mapper.EmployeeMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class EmployeeService { @Autowired EmployeeMapper employeeMapper; /**  * 将方法的运行结果进行缓存,以后要是再有相同的数据,直接从缓存中获取,不用调用方法  * CacheManager中管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每个缓存组件都有自己的唯一名字;  *  * 属性:  *  CacheName/value:指定存储缓存组件的名字  *  key:缓存数据使用的key,可以使用它来指定。默认是使用方法参数的值,或方法的返回值  *  编写Spel表达式:#id 参数id的值, #a0/#p0 #root.args[0]  *  keyGenerator:key的生成器,自己可以指定key的生成器的组件id  *  key/keyGendertor二选一使用  *  *  cacheManager指定Cache管理器,或者cacheReslover指定获取解析器  *  condition:指定符合条件的情况下,才缓存;  *  unless:否定缓存,unless指定的条件为true,方法的返回值就不会被缓存,可以获取到结果进行判断  *  sync:是否使用异步模式,unless不支持  *  *  */ @Cacheable(cacheNames = {"emp"},key = "#id",condition = "#id>0",unless = "#result==null") public Employee getEmp(Integer id){  System.out.println("查询id= " id "的员工");  return employeeMapper.getEmpById(id); }}

8、编写controller测试

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

9、查看结果。具体结果就不截图了,缓存功能开启, 如果条件相同,只会查询一次数据库。

Cache注解

  • @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置。在这里@CacheConfig(cacheNames = "users"):配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义。
    •   该注解是整合了Cacheable /Cacheput / CacheEvict。设置在类上,该类的方法上面的cache注解均不用设置name。
  • @Cacheable:配置了findByName函数的返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。该注解主要有下面几个参数:
    • valuecacheNames:两个等同的参数(cacheNames为Spring 4新增,作为value的别名),用于指定缓存存储的集合名。由于Spring 4中新增了@CacheConfig,因此在Spring 3中原本必须有的value属性,也成为非必需项了
    • key:缓存对象存储在M
源文地址:https://www.guoxiongfei.cn/cntech/3355.html