程序员:SpringBoot和Redis实现Java缓存技术

缓存在大家工作中被广泛应用,特别是一些互联网公司的程序员。

今天给大家讲解一个实例,基于SpringBoot环境下的RedisTemplate来对redis数据库进行操作,同时也使用到SSM来进行数据库操作,进而实现Java缓存技术的实例开发,下面我开始详细讲解具体的实现过程:

项目的目录结构:

程序员:SpringBoot和Redis实现Java缓存技术

该项目为maven项目结构,相信有学习SpringBoot框架的读者应该都会创建这种项目,此处笔者就不讲解,有需要了解的读者可以在评论区下留言,笔者提供创建链接。

在pom.xml文件中添加依赖:

<project>

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>2.0.2.RELEASE/<version>

<relativepath>

<groupid>com.example/<groupid>

<artifactid>SpringBootDemo/<artifactid>

<version>0.0.1-SNAPSHOT/<version>

<name>SpringBootDemo/<name>

<description>Demo project for Spring Boot/<description>

<properties>

<project.build.sourceencoding>UTF-8/<project.build.sourceencoding>

<project.reporting.outputencoding>UTF-8/<project.reporting.outputencoding>

<java.version>1.8/<java.version>

<dependencies>

<dependency>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-starter-web/<artifactid>

<dependency>

<groupid>org.mybatis.spring.boot/<groupid>

<artifactid>mybatis-spring-boot-starter/<artifactid>

<version>1.3.2/<version>

<dependency>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-devtools/<artifactid>

<optional>true/<optional>

<scope>true/<scope>

<dependency>

<groupid>org.apache.tomcat.embed/<groupid>

<artifactid>tomcat-embed-jasper/<artifactid>

<dependency>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-starter-tomcat/<artifactid>

<scope>provided/<scope>

<dependency>

<groupid>mysql/<groupid>

<artifactid>mysql-connector-java/<artifactid>

<scope>runtime/<scope>

<dependency>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-starter/<artifactid>

<dependency>

<groupid>javax.servlet/<groupid>

<artifactid>javax.servlet-api/<artifactid>

<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>

<dependency>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-starter-data-jpa/<artifactid>

<dependency>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-starter-data-redis/<artifactid>

<dependency>

<groupid>com.alibaba/<groupid>

<artifactid>fastjson/<artifactid>

<version>1.2.44/<version>

<dependency> /<dependency>

<groupid>com.google.code.gson/<groupid>

<artifactid>gson/<artifactid>

<version>2.8.5/<version>

<build>

<plugins>

<plugin>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-maven-plugin/<artifactid>

<configuration>

<fork>true/<fork>

/<project>


在配置文件application.properties中添加以下信息:

server.port: 8081

# mysql

spring.datasource.url: jdbc:mysql://localhost:3306/jsp?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

spring.datasource.username: root

spring.datasource.password: root

# spring.datasource.driver-class-name: com.mysql.jdbc.Driver not can use

spring.datasource.driver-class-name: com.mysql.jdbc.Driver

spring.datasource.dbcp2.validation-query: 'select 1'

spring.datasource.dbcp2.test-on-borrow: true

spring.datasource.dbcp2.test-while-idle: true

spring.datasource.dbcp2.time-between-eviction-runs-millis: 27800

spring.datasource.dbcp2.initial-size: 5

spring.datasource.dbcp2.min-idle: 5

spring.datasource.dbcp2.max-idle: 100

spring.datasource.dbcp2.max-wait-millis: 10000

# mybatis

# 指mapper映射文件会绑定到src/main/resource/mapper目录下

mybatis.mapper-locations: classpath*:mapper/**/*.xml

mybatis.configuration.map-underscore-to-camel-case: true

# JSP use's configution spring.mvc.view.prefix

spring.mvc.view.prefix = /WEB-INF/views/

spring.mvc.view.suffix = .jsp

#解决sql Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set 的问题

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

#本地主机名

spring.redis.host=127.0.0.1

#redis默认的端口值

spring.redis.port=6379

#redis数据库,总共有0-15可以输入

spring.redis.database=1


注意:

①此处的mysql数据库信息配置读者可以根据自己的本地数据库信息进行修改;

②配置信息中“classpath*:mapper/**/*.xml”是指映射到mapper/路径下所有目录的xml文件;

③spring.redis.database=1的“1”代表redis数据库下对应的编号,如图所示:

程序员:SpringBoot和Redis实现Java缓存技术

设计思路:

在获取数据前,先对跟数据是否存在于redis缓存中进行判断,如果存在,则直接从缓存中把数据读取出来;否则,先把数据从mysql或SQL Server数据库中查询出来,然后再把查询出来的数据添加到redis缓存中。

① 实体类的编写:

import javax.persistence.Id;

import javax.persistence.Table;

/*

* @time:2020/1/2

* @descrition:学生实体类,用于封装学生的基本信息

**/

@Table(name="student")

public class Student {

@Id

String id;//主键

String name;//姓名

String sno;//学号

String sex;//性别

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSno() {

return sno;

}

public void setSno(String sno) {

this.sno = sno;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

}


在此说明一下,本文并没有单独把数据库文件导出来给大家使用,读者们可以自己去创建一个数据库及表来进行测试,相信能学到这里的读者都应该具备较好的编程基础,对于这种简单的数据库设计应该只需要几分钟就能完成的,实在不会可以在评论区下留言,笔者一一帮忙解答。

②dao层的编写:

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import Test.entity.Student;

/*

* @time: 2020/1/3

* @description: 映射对应xml配置文件

*

**/

@Mapper

public interface TestDao {

//查询学生信息

public List<student> getStuList();/<student>

}


③TestMapper.xml配置文件的编写:

<mapper>

<select>

select * from student


此处也要注意一点,即namespace和resultType属性的值都要对应自己的项目路径来编写,否则一定会出错,请各位读者认真查阅,避免不必要的错误。

④业务逻辑层的编写:

import java.lang.reflect.Type;

import java.util.List;

import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.ValueOperations;

import org.springframework.stereotype.Service;

import com.google.gson.Gson;

import com.google.gson.reflect.TypeToken;

import Test.dao.TestDao;

import Test.entity.Student;

/*

* @time: 2020/1/3

* @description: 测试业务逻辑类,用于编写代码的具体实现逻辑

*

**/

@Service

public class TestService {

@Autowired

private RedisTemplate<string> redisTemplate;/<string>

@Autowired

private TestDao testDao;

/*

* 此处为redis缓存技术的核心代码

* 这是基于一种相对简单方式去进行缓存的,适合刚入门的新手去学习

**/

public List<student> getStuList(){/<student>

String key = "student_list";

ValueOperations<string> operations = redisTemplate.opsForValue();/<string>

//如果该键存在,说明缓存中存在,则直接从缓存中把数据读出即可,而不需要查询数据库进行获取。

if (redisTemplate.hasKey(key)) {

//从缓存中

String redisList = (String) operations.get(key);

Type type = new TypeToken<list>>() {}.getType();/<list>

List<student> list = new Gson().fromJson(redisList, type);/<student>

System.out.println("从缓存取得数据"+ list.size()+"条数" );

return list;

}

//此处是笔者在后端数据库中获取的list数据集合,读者可以根据自己的需求进行修改。

List<student> list = studentMapper.selectAll();/<student>

System.out.println("从数据库中查询数据");

//再把list集合强制转化为json格式数据

String toJson = new Gson().toJson(list);

// 保存到redis数据库缓存中,第一个参数为键名,第二个参数为数据,第三个参数为有效时间,第四个为时间单位

operations.set(key, toJson, 60, TimeUnit.SECONDS);

System.out.println("已经把list集合保存到缓存中");

return list;

}

}


⑤控制层的编写:

import java.util.List;

import javax.servlet.ServletRequest;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import Test.entity.Student;

import Test.service.TestService;

/*

* @time: 2020/1/3

* @description: 测试控制器,有设置到两层访问路径

**/

@Controller

@RequestMapping(value="student")

public class TestController {

@Autowired

private TestService testService;

//@ResponseBody注解可以让该方法映射对应数据返回到前端页面,而不是查找jsp视图

@RequestMapping(value="getStuList",produces = "application/json;charset=UTF-8")

@ResponseBody

public List<student> getStuList(ServletRequest request) {/<student>

return testService.getStuList();

}

}


⑥最后在浏览器中输入:http://localhost:8081/student/getStuList。结果如下:

此处是把list集合以json数据格式显示在页面中,方便读者去查看效果。

同时,我们也可以注意到,当我们第一次在浏览器访问时,该集合是从mysql数据库进行获取的,当我们开始第二次访问时,会发现我们的数据是从redis缓存中进行获取,这些信息可以从编译器的控制台中查看,具体如下:

程序员:SpringBoot和Redis实现Java缓存技术


分享到:


相關文章: