百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Spring Boot 整合 Redis(spring boot整合redis(单机+集群))

wptr33 2025-02-03 15:30 53 浏览

1 Redis 介绍

Redis 是一个开源(BSD许可)的、内存中的数据结构存储系统,它可以用作数据库缓存消息中间件,并提供多种语言的API。

1.1 Redis 优点

  1. 存取速度快:Redis速度非常快,每秒可执行大约110000次的设值操作,或者执行81000次的读取操作。
  2. 支持丰富的数据类型:Redis支持开发人员常用的大多数数据类型,例如列表、集合、排序集和散列等。
  3. 操作具有原子性:所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新后的值。
  4. 提供多种功能:Redis提供了多种功能特性,可用作非关系型数据库、缓存中间件、消息中间件等。

1.2 Redis 的下载安装及连接

【基础篇】一文带你掌握 Redis - 潘志的研发笔记的文章 - 知乎

链接地址:

https://zhuanlan.zhihu.com/p/593697447

这篇文章对 Redis 进行了全面的介绍,涵盖了其基本概念、安装方法、命令行客户端操作、事务与 Lua 脚本操作以及可视化客户端等方面。

2 流程

  1. 创建项目,引入相应的依赖启动器。

使用Spring Initializr的方式构建项目,选择依赖SQL->MyBatis Framework \ MySQL Driver 。

  1. 在pom文件中添加 Spring Data Redis 依赖启动器。

	org.springframework.boot
	spring-boot-starter-data-redis
  1. 编写实体类。

(1)编写实体类Person。

package com.itheima.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("persons")
// 加上这个注解就会在redis中创建一个名为persons的hash数据结构(存储空间)
public class Person {
    @Id // 用于表示实体类主键
    private String id;

    // 由于我们有可能要根据姓单独查询或者根据名单独插叙,也可能进行组合查询。
    // 针对这种查询情况,要加上@Indexed
    @Indexed // 用于标识该属性会在redis数据库中生成二级索引
    private String firstname;
    @Indexed
    private String lastname;

    private Address address;
    private List familyList;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public List getFamilyList() {
        return familyList;
    }

    public void setFamilyList(List familyList) {
        this.familyList = familyList;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", firstname='" + firstname + '\'' +
                ", lastname='" + lastname + '\'' +
                ", address=" + address +
                ", familyList=" + familyList +
                '}';
    }
}

(2)编写实体类Address。

package com.itheima.domain;

import org.springframework.data.redis.core.index.Indexed;

public class Address {
    @Indexed
    private String city;
    @Indexed
    private String country;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "Address{" +
                "city='" + city + '\'' +
                ", country='" + country + '\'' +
                '}';
    }
}

(3)编写实体类Family。

package com.itheima.domain;

import org.springframework.data.redis.core.index.Indexed;

public class Family {
    @Indexed
    private String type;
    @Indexed
    private String username;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "Family{" +
                "type='" + type + '\'' +
                ", username='" + username + '\'' +
                '}';
    }
}
  1. 编写Repository接口PersonRepository。
package com.itheima.repository;

import com.itheima.domain.Person;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.domain.Page;

import java.util.List;

// <当前操作实体类,主键数据类型>
public interface PersonRepository extends CrudRepository{

    // 1.根据姓氏查询某人
    List findByLastname(String lastname);
    // 2.根据姓氏查询某人,采用分页的格式。
    Page findPersonByLastname(String lastname, Pageable page);

    // 3.根据姓氏和名字查询某些人
    List findByFirstnameAndLastname(String firstname, String lastname);

    // 4.查询某座城市居住的所有人
    List findByAddress_City(String city);

    // 5.查询所有相同姓氏的人
    List findByFamilyList_Username(String username);
}
  1. 在全局配置文件application.properties中添加Redis数据库连接配置。
spring.data.redis.host=192.268.128.152
spring.data.redis.port=6379
spring.data.redis.password=

:这里是远程连接linux中的redis,没有设置密码的话,
spring.data.redis.password参数的值为空。

  1. 编写单元测试进行接口方法测试以及整合测试。
package com.itheima;

import com.itheima.domain.Address;
import com.itheima.domain.Family;
import com.itheima.domain.Person;
import com.itheima.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;
import java.util.Optional;

@SpringBootTest
class RedisTest {

    @Autowired
    private PersonRepository personRepository;

    @Test
    public void savePerson(){
        Person person = new Person();
        person.setFirstname("三三");
        person.setLastname("张");

        Address address = new Address();
        address.setCity("北京");

        person.setAddress(address);

        Family family1 = new Family();
        family1.setType("父亲");
        family1.setUsername("张二");

        Family family2 = new Family();
        family2.setType("母亲");
        family2.setUsername("李一");

        ArrayList families = new ArrayList<>();
        families.add(family1);
        families.add(family2);

        person.setFamilyList(families);

        // 保存数据
        personRepository.save(person);

    }
    }
  1. redis储存数据展示如下图。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...