Spring Boot整合Redis
Redis介绍
Redis是一个开源 (BSD许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,并提供多种语言的APl。Redis支持多种类型的数据结构,例如字符串( strings)、散列(hashes)、列表(lists)、集合(sets )等。同时,Redis内部内置了复本( replication) 、LUA脚本(Lua scripting)、LRU驱动事件(LRU eviction)、事务( Transaction )和不同级别的磁盘持久化( persistence ),并通过Redis Sentinel和自动分区提供高可用性( high availability )。
相较于其他的key-value键值存储系统而言,Redis 主要有以下优点。
( 1)存取速度快: Redis速度非常快,每秒可执行大约110000次的设值操作,或者执行81 000次的读取操作。
(2)支持丰富的数据类型: Redis 支持开发人员常用的大多数数据类型,例如列表、集合、排序集和散列等。
(3)操作具有原子性:所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新后的值。
(4)提供多种功能: Redis 提供了多种功能特性,可用作非关系型数据库、缓存中间件、消息中间件等。
Redis下载安装
下载地址:https://github.com/tporadowski/redis/releases
Redis支持多种方式的安装配置,如Windows、Linux系统安装,Docker镜像安装等,我们下面介绍的是Windows安装。
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到硬盘,解压后,将文件夹重新命名为 redis。
打开文件,内容如下:
打开一个 cmd 窗口:
进入界面输入:
redis-server.exe redis.windows.conf
输入之后,会显示如下界面:
这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。
在redis目录下运行:
redis-cli.exe -h 127.0.0.1 -p 6379
设置键值对:
set myKey abc
取出键值对:
get myKey
显示如下页面后证明Redis服务正常启动,无异常。
(如上操作是为了测试Redis能否正常使用)
开启Redis服务
在Windows下Redis安装包解压后会有多个目录文件,包括两个重要的可执行文件:redis-cli.exe和redis-server.exe。其中,redis-server.exe用于开启Redis服务,redis-cli.exe用于开启客户端工具。
这里选择双击redis-server.exe文件即可开启Redis服务,效果图如下:
从图中可以看出Redis服务正常启动同时在终端窗口显示了当前Redis版本为5.0.14.1和默认启动端口为6379。
Redis可视化客户端工具安装
这里使用一个Redis客户端可视化管理工具Redis Desktop Manager连接Redis服务进行管理,可以去查找其他博主的安装教程。
使用Spring Boot整合Redis
上面对Redis进行了简单的介绍,并完成了Redis服务的安装配置,接下来开始讲解Spring Boot与Redis的整合使用,具体步骤如下。
- 添加Spring Data Redis依赖启动器。先在项目的pom.xml文件中添加Redis依赖启动器,示例代码如下:
<!-- Redis服务启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 编写实体类。在com.example.demo.domain包下编写对应的实体类,如像显示
Student.java
package com.example.demo.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;
import java.util.List;
@RedisHash("students")//指定操作实体类对象在Redis数据库中的存储空间
public class Student {
@Id
private String id;
@Indexed
private String name;
@Indexed
private String sid;
private College college;
private List<Subject> subjectList;
public Student() {
}
public Student(String name,String sid){
this.name=name;
this.sid=sid;
}
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 getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public College getCollege() {
return college;
}
public void setCollege(College college) {
this.college = college;
}
public List<Subject> getSubjectList() {
return subjectList;
}
public void setSubjectList(List<Subject> subjectList) {
this.subjectList = subjectList;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", sid='" + sid + '\'' +
", college=" + college +
", subjectList=" + subjectList +
'}';
}
}
College.java
package com.example.demo.domain;
import org.springframework.data.redis.core.index.Indexed;
public class College {
@Indexed
private String college;
@Indexed
private String school;
public College(String college,String school){
this.college=college;
this.school=school;
}
public String getCollege() {
return college;
}
public void setCollege(String college) {
this.college = college;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String toString() {
return "College{" +
"college='" + college + '\'' +
", school='" + school + '\'' +
'}';
}
}
Subject.java
package com.example.demo.domain;
import org.springframework.data.redis.core.index.Indexed;
public class Subject {
@Indexed
private String course;
@Indexed
private String grade;
public Subject(String course,String grade){
this.course=course;
this.grade=grade;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Subject{" +
"course='" + course + '\'' +
", grade='" + grade + '\'' +
'}';
}
}
3.编写Repository接口。在com.example.demo.repository包下创建Student实体类的StudentRepository接口。
package com.example.demo.repository;
import com.example.demo.domain.Student;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface StudentRepository extends CrudRepository<Student,String> {
List<Student> findBySid(String sid);
Page<Student> findStudentBySid(String sid, Pageable page);
List<Student> findByNameAndSid(String name, String sid);
List<Student> findByCollege_College(String college);
List<Student> findBySubjectList_Grade(String grade);
}
4.Redis数据库连接配置。在全局配置文件application.properties中添加Redis数据库的连接配置。
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
5.编写单元测试进行接口方法测试。
package com.example.demo;
import com.example.demo.domain.College;
import com.example.demo.domain.Student;
import com.example.demo.domain.Subject;
import com.example.demo.repository.StudentRepository;
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.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTests {
@Autowired
private StudentRepository repository;
@Test
public void saveStudent(){
Student student=new Student("小明","001");
Student student1=new Student("james","002");
College college=new College("计算机学院","广东科技学院");
student.setCollege(college);
List<Subject> list=new ArrayList<>();
Subject englis=new Subject("英语","90");
Subject language=new Subject("语文","80");
list.add(englis);
list.add(language);
student.setSubjectList(list);
Student save=repository.save(student);
Student save2=repository.save(student1);
System.out.println(save);
System.out.println(save2);
}
@Test
public void selectStudent(){
List<Student> list=repository.findByCollege_College("计算机学院");
System.out.println(list);
}
@Test
public void updateStudent(){
Student student=repository.findByNameAndSid("小明","001").get(0);
student.setSid("003");
Student update=repository.save(student);
System.out.println(update);
}
@Test
public void deleteStudent(){
Student student=repository.findByNameAndSid("小明","003").get(0);
repository.delete(student);
}
}
6.整合测试。选择RedisTests测试类中的saveStudent()方法进行效果演示,效果如下:
打开之前连接的Redis客户端可视化管理工具查看数据,如下图: