前言

我们都知道,一个程序的瓶颈通常都在数据库,很多场景需要获取相同的数据。比如网站页面数据等,需要一次次的请求数据库,导致大部分时间都浪费在数据库查询和方法调用上,这时就可以利用到缓存来缓解这个问题。

简介

本文来介绍SpringBoot来简单整合缓存,使用SpringBoot+JPA+mysql来进行数据库操作。整合JPA的文章,具体可以参考 传送门

新建项目

创建一个项目,pom文件中加入spring-boot-starter-cache依赖,完整pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<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> <groupId>com.dalaoyang</groupId>
<artifactId>springboot_cache</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>springboot_cache</name>
<description>springboot_cache</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</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>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

配置文件如下,和整合JPA一样,没有做任何修改:

##端口号
server.port=8888 ##数据库配置
##数据库地址
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false
##数据库用户名
spring.datasource.username=root
##数据库密码
spring.datasource.password=root
##数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver ##validate 加载hibernate时,验证创建数据库表结构
##create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
##create-drop 加载hibernate时创建,退出是删除表结构
##update 加载hibernate自动更新数据库结构
##validate 启动时验证表的结构,不会创建表
##none 启动时不做任何操作
spring.jpa.hibernate.ddl-auto=update ##控制台打印sql
spring.jpa.show-sql=true

实体类代码如下:

package com.dalaoyang.entity;

import javax.persistence.*;

/**
* @author dalaoyang
* @Description
* @project springboot_learn
* @package com.dalaoyang.entity
* @email yangyang@dalaoyang.cn
* @date 2018/5/28
*/
@Entity
public class House {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(length = 10)
private String houseName;
private String houseSize; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getHouseName() {
return houseName;
} public void setHouseName(String houseName) {
this.houseName = houseName;
} public String getHouseSize() {
return houseSize;
} public void setHouseSize(String houseSize) {
this.houseSize = houseSize;
} public House(String houseName, String houseSize) {
this.houseName = houseName;
this.houseSize = houseSize;
} public House(int id,String houseName, String houseSize) {
this.id = id;
this.houseName = houseName;
this.houseSize = houseSize;
} public House() {
}
}

Repository如下:

package com.dalaoyang.repository;

import com.dalaoyang.entity.House;
import org.springframework.data.jpa.repository.JpaRepository; /**
* @author dalaoyang
* @Description
* @project springboot_learn
* @package com.dalaoyang.repository
* @email yangyang@dalaoyang.cn
* @date 2018/5/28
*/
public interface HouseRepository extends JpaRepository<House,Integer> {
}

启动类上加入@EnableCaching开启缓存,完整代码如下:

package com.dalaoyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication
//开启缓存
@EnableCaching
public class SpringbootCacheApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootCacheApplication.class, args);
}
}

还是和以往一样,使用Controller做测试,先展示一下代码:

package com.dalaoyang.controller;

import com.dalaoyang.entity.House;
import com.dalaoyang.repository.HouseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author dalaoyang
* @Description
* @project springboot_learn
* @package com.dalaoyang.controller
* @email yangyang@dalaoyang.cn
* @date 2018/5/28
*/
@RestController
public class HouseController { @Autowired
private HouseRepository houseRepository; //http://localhost:8888/saveHouse?id=1&houseName=别墅&houseSize=1220平方米
@GetMapping("/saveHouse")
@CachePut(value = "house", key = "#id")
public House saveHouse(Integer id,String houseName,String houseSize){
House house = new House(id,houseName, houseSize);
houseRepository.save(house);
return house;
} //http://localhost:8888/queryHouse?id=1
@GetMapping("/queryHouse")
@Cacheable(value = "house", key = "#id")
public House queryHouse(Integer id){
House house = houseRepository.findOne(id);
return house;
} //http://localhost:8888/deleteHouse?id=1
@GetMapping("/deleteHouse")
@CacheEvict(value = "house", key = "#id")
public String deleteHouse(Integer id){
houseRepository.delete(id);
return "success";
} //http://localhost:8888/deleteCache
@GetMapping("/deleteCache")
@CacheEvict(value = "house", allEntries = true)
public void deleteCache() {
}
}

解释测试方法

1.saveHouse方法

方法中使用到了@CachePut注解,这个注解直接将返回值放入缓存中,通常用于保存和修改方法中

2.queryHouse方法

方法中使用到了@Cacheable注解,这个注解在执行前先查看缓存中是不是已经存在了,如果存在,直接返回。如果不存在,将方法的返回值放入缓存。

3.deleteHouse方法

方法中使用到了@CacheEvict注解,这个注解在执行方法执行成功后会从缓存中移除

4.deleteCache方法

这个方法的也是使用的@CacheEvict注解,不同的是使用了allEntries熟悉,默认为false,true的时候移除所有缓存。

测试

1.首先访问http://localhost:8888/saveHouse?id=1&houseName=别墅&houseSize=1220平方米,然后查看数据库和控制台,如下图:

2.访问http://localhost:8888/queryHouse?id=1,查看页面数据和控制台。因为设置了打印执行jpa查询的话打印sql,看下图控制台没有打印,证明在保存的时候@CachePut注解已经将其放入了缓存中。

3.调用清空缓存方法http://localhost:8888/deleteCache然后在次访问查询方法http://localhost:8888/queryHouse?id=1,查看控制台如下,可以到清空缓存后,在访问就需要查询数据库。

4.调用删除方法http://localhost:8888/deleteHouse?id=1,然后在方法查询方法http://localhost:8888/queryHouse?id=1,查看控制台如下,可以到删除缓存后,在访问也查询了数据库。

源码下载 :大老杨码云

个人网站:https://www.dalaoyang.cn

关注作者公众号

SpringBoot使用缓存的更多相关文章

  1. 带着新人学springboot的应用03(springboot+mybatis+缓存 下)

    springboot+mybatis+缓存,基本的用法想必是会了,现在说一说内部大概的原理. 稍微提一下mybatis,只要导入了mybatis的依赖,那么有个自动配置类就会生效,你可以去mybati ...

  2. SpringBoot 与缓存

    1. JSR107 Java Caching 定义了5个核心接口: CachingProvider:定义了创建,配置,获取,管理和控制多个CacheManager; CacheManager:定义了创 ...

  3. SpringBoot 整合缓存Cacheable实战详细使用

    前言 我知道在接口api项目中,频繁的调用接口获取数据,查询数据库是非常耗费资源的,于是就有了缓存技术,可以把一些不常更新,或者经常使用的数据,缓存起来,然后下次再请求时候,就直接从缓存中获取,不需要 ...

  4. springboot redis 缓存对象

    只要加入spring-boot-starter-data-redis , springboot 会自动识别并使用redis作为缓存容器,使用方式如下 gradle加入依赖 compile(" ...

  5. springboot~hazelcast缓存中间件

    缓存来了 在dotnet平台有自己的缓存框架,在java springboot里当然了集成了很多,而且缓存的中间件也可以进行多种选择,向redis, hazelcast都是分布式的缓存中间件,今天主要 ...

  6. 带着新人学springboot的应用02(springboot+mybatis+缓存 中)

    继续接着上一节,大家应该知道驼峰命名法吧!就是我们javabean中属性一般命名是lastName,userName这种类型的,而数据库中列名一般都是last_name,user_name这种的,要让 ...

  7. 带着新人学springboot的应用01(springboot+mybatis+缓存 上)

    上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...

  8. SpringBoot Redis缓存 @Cacheable、@CacheEvict、@CachePut

    文章来源 https://blog.csdn.net/u010588262/article/details/81003493 1. pom.xml <dependency> <gro ...

  9. springboot Redis 缓存

    1,先整合 redis 和 mybatis 步骤一: springboot 整合 redis 步骤二: springboot 整合 mybatis 2,启动类添加 @EnableCaching 注解, ...

  10. SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]

    https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...

随机推荐

  1. Python基础知识之大杂烩

    一.range 和 xrange 的区别 xrange 与 range 基本上都是在循环的时候用,两者的用法完全相同.所不同的是xrange生成的是一个生成器,而range生成的是一个list对象. ...

  2. Fatal error: Uncaught Error: Call to undefined function mysqli_connect()

    sudo apt-get install php7.2-mysql  //版本号肯能不一样 sudo dpkg-reconfigure  php7.2-mysql sudo /etc/init.d/m ...

  3. linux 基础知识(三)

    抽空把Linux的一些基础的东西再补充一下,安全的东西真的很多都是要自己不断的学习,很多还是今天学习了一点时间过后不用就会忘记.所以学习的东西就是要不断地往复. 有时候感觉有时候快就是慢,慢就是快. ...

  4. python字符编码和文件处理

    一.了解字符编码的知识储备 1.文本编辑器存取文件的原理(nodepad++,python,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放于内存中的,断 ...

  5. Jmeter3.0 中文乱码的解决方法

    在Body Data中输入中文时,发现是乱码,如下图 这种情况在jmeter3.0的版本中才会产生,由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示. 解决方法 ...

  6. java 基础知识点必备

    1.为什么集合类没有实现Cloneable和Serializable接口? 克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的.因此,应该由集合类的具体实 ...

  7. OpenCV-Python入门教程3-图像基本操作(访问像素点/ROI/通道分离)

    一.获取和修改像素点的值 import cv2img = cv2.imread('lena.jpg') # 100, 90表示行列坐标 px = img[100, 90] print(px) # 获取 ...

  8. 关于The specified Android SDK Build Tools version (26.0.2) is ignored, as it is below the minimum...

    今天将项目迁移到另一台笔记本,进行build出现以下问题,导致build失败 The specified Android SDK Build Tools version (26.0.2) is ign ...

  9. CAS5.3.X 配置备忘

    ## # 普通MD5用户jdbc验证 ## #配置数据库连接 cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver cas.auth ...

  10. CentOS挂Windows的NFS备忘

    Windows NFS 安装和配置  注:需要将名称为“所有计算机”的访问类型改为“无访问权限”,再将可访问IP的访问类型改为“读写”,并勾选“允许根目录访问” ,如WINDOWS有防火墙开放“204 ...