SpringBoot整合Redis

SpringBoot整合Redis

添加依赖

首先在项目中添加 Spring Data Redis 依赖启动器

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

上述添加的 Redis 依赖启动器代码中,没有编写对应的版本号信息,这是因为 Spring Boot 为 Redis 实现了自动配置,所以会统一管理版本号信息。

编写实体类

Person.java

import lombok.Data;
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("persons") // 指定操作实体类对象在 Redis 数据库中的存储空间
@Data
public class Person {
    @Id  // 标识实体类主键
    private String id;
    @Indexed  // 标识对应属性在 Redis 数据库中生成二级索引
    private String firstname;
    @Indexed
    private String lastname;

    private Address address;

    private List<Family> families;

    public Person(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }
}

Address.java

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.redis.core.index.Indexed;

@Data
@AllArgsConstructor
public class Address {
    @Indexed
    private String city;
    @Indexed
    private String country;
}

Family.java

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.redis.core.index.Indexed;

@Data
@AllArgsConstructor
public class Family {
    @Indexed
    private String type;
    @Indexed
    private String username;
}

这些实体类中,针对面向 Redis 数据库的数据操作设置了几个主要注解,这几个注解的说明如下:

  • @RedisHash("persoon") 用于指定操作实体类对象在 Redis 数据库中的存储空间,此处表示针对 Person 实体类的数据操作都存储在 Redis 数据库中名为 persons 的存储空间下。
  • @Id 用于标识实体类主键。在 Redis 数据库中会默认生成字符串形式的 HashKey 表示唯一的实体对象 id,当然也可以在数据存储时手动指定 id。
  • @Indexed 用于标识对应属性在 Redis 数据库中生成二级索引。使用该注解后会在 Redis 数据库中生成属性对应的二级索引,索引名称就是属性名,可以方便地进行数据条件查询。

编写 Repository 接口

Spring Boot 针对包括 Redis 在内的一些常用数据库提供了自动化配置,可以通过实现 Repository 接口简化对数据库中的数据进行的增删改查操作,这些操作方法与 Spring Data JPA 操作数据的使用方法基本相同,可以使用方法名关键字进行数据操作。

创建操作 Person 实体类的 PersonRepository 接口。

import com.syuez.springbootredis.entity.Person;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface PersonRepository extends CrudRepository<Person, String> {
    List<Person> findByLastname(String lastname);
    Page<Person> findPersonByLastname(String lastname, Pageable page);
    List<Person> findByFirstnameAndLastname(String firstname, String lastname);
    List<Person> findByAddress_City(String city);
    List<Person> findByFamilies_Username(String username);
}

PersonRepository 接口继承自 CrudRepository 接口,该接口定义了若干查询方法。

需要说明的是,在操作 Redis 数据库时编写的 Repository 接口文件需要继承 CrudRepository 接口,而不是继承 JpaRepository,这是因为 JpaRepository 是 Spring Boot 整合 JPA 特有的。当然,也可以在项目 pom.xml 文件中同时导入 Spring Boot 整合 JPA 依赖和 Redis 依赖,这样就可以编写一个继承 JpaRepository 的接口操作 Redis 数据库了。

Redis 连接配置

在项目的全局配置文件 application.properties 中添加 Redis 的连接配置:

spring.redis.host=localhost
spring.redis.port=6379
# 密码默认为空
spring.redis.password= 

单元测试

编写单元测试进行接口方法测试。

RedisTests.java

import com.syuez.springbootredis.entity.Address;
import com.syuez.springbootredis.entity.Family;
import com.syuez.springbootredis.entity.Person;
import com.syuez.springbootredis.repository.PersonRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
public class RedisTests {
    @Autowired
    private PersonRepository personRepository;

    @Test
    public void savePerson() {
        Person person = new Person("张","有才");
        Person person2 = new Person("James","Harden");
        // 创建并添加住址信息
        Address address = new Address("北京","China");
        person.setAddress(address);
        // 创建并添加家庭成员
        List<Family> list = new ArrayList<>();
        Family dad = new Family("父亲","张良");
        Family mom = new Family("母亲","李香君");
        list.add(dad);
        list.add(mom);
        person.setFamilies(list);
        Person save = personRepository.save(person);
        Person save2 = personRepository.save(person2);
        System.out.println(save);
        System.out.println(save2);
    }
    @Test
    public void selectPerson() {
        List<Person> list = personRepository.findByAddress_City("北京");
        System.out.println(list);
    }
    @Test
    public void updatePerson() {
        Person person =personRepository.findByFirstnameAndLastname("张","有才").get(0);
        person.setLastname("小明");
        Person update = personRepository.save(person);
        System.out.println(update);
    }
    @Test
    public void deletePerson() {
        Person person = personRepository.findByFirstnameAndLastname("张","有才").get(0);
        personRepository.delete(person);
    }
}

这里就 不展示测试结果了,可以使用 Redis 客户端可视化管理工具查看数据。


本文摘自《Spring Boot 企业级开发教程》