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

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

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

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储存数据展示如下图。

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...