前言

除了对关系型数据库的整合支持外,SpringBoot对非关系型数据库也提供了非常好的支持,比如,对Redis的支持。

Redis(Remote Dictionary Server,即远程字典服务)是一个高性能的key-value数据库,它是一种跨平台的非关系型数据库。Redis 通常被称为数据结构服务器,因为它的值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

下面,我们来看一下SpringBoot与Redis要如何进行整合。

SpringBoot与非关系型数据库Redis的整合

(1)添加Spring Data Redis依赖启动器

引入这个依赖器创建项目,在项目pom.xml文件会出现以下依赖:

(2)编写实体类

Person:

package com.hardy.springbootdataredis.domain;

import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed; /**
* @Author: HardyYao
* @Date: 2021/6/15
*/
@RedisHash("persons") // 指定操作实体类对象在Redis数据库中的存储空间
public class Person { @Id // 标识实体类主键
private String id; @Indexed // 标识对应属性在Redis数据库中生成二级索引
private String firstname; @Indexed
private String lastname; private Address address; 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;
} @Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", firstname='" + firstname + '\'' +
", lastname='" + lastname + '\'' +
", address=" + address +
'}';
}
}

Address:

package com.hardy.springbootdataredis.domain;

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

/**
* @Author: HardyYao
* @Date: 2021/6/15
*/
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 + '\'' +
'}';
}
}

在上述两个实体类中,涉及了关于Redis数据库的数据操作的几个注解:

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

(3)编写Repository接口

SpringBoot针对包括Redis在内的一些常用数据库提供了自动化配置,可以通过实现Repository接口简化对数据库中的数据进行增删查改的操作:

package com.hardy.springbootdataredis.repository;

import com.hardy.springbootdataredis.domain.Person;
import org.springframework.data.repository.CrudRepository; import java.util.List; /**
* @Author: HardyYao
* @Date: 2021/6/15
*/
public interface PersonRepository extends CrudRepository<Person, String> { List<Person> findByAddress_City(String City); }

注意:在操作Redis数据库时编写的Repository接口类需要继承最底层的CrudRepository接口,而不是继承JpaRepository(JpaRepository是SpringBoot整合JPA特有的)。当然,也可以在项目pom.xml文件中同时导入SpringBoot整合的JPA依赖和Redis依赖,这样就可以编写一个继承JpaRepository的接口的操作Redis数据库。

(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.hardy.springbootdataredis;

import com.hardy.springbootdataredis.domain.Address;
import com.hardy.springbootdataredis.domain.Person;
import com.hardy.springbootdataredis.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.List; @SpringBootTest
class SpringbootdataRedisApplicationTests { @Autowired
private PersonRepository repository; @Test
public void savePerson() {
Person person = new Person();
person.setFirstname("张");
person.setLastname("三");
Address address = new Address();
address.setCity("北京");
address.setCountry("中国");
person.setAddress(address);
// 向Redis数据库添加数据
Person save = repository.save(person);
} @Test
public void selectPerson() {
List<Person> list = repository.findByAddress_City("北京");
for (Person person : list) {
System.out.println(person);
}
} }

(6)整合测试

打开Redis客户端可视化管理工具,先连接本地Redis服务器:

连接成功后,可以看到原来本地Redis数据库中是没有数据的:

运行上文中编写好的两个测试方法,查看控制台打印结果:

为了验证save()方法确实把数据写入到本地Redis数据库中了,打开Redis客户端可视化管理工具,刷新一下数据,可以看到数据成功写入了:

通过上图可知:执行save()方法添加的数据在Redis数据库中存储成功。另外,在数据库列表左侧还形成了一张类似address.city、firstname、lastname等二级索引,这些二级索引是前面创建Person类时在对应属性上添加@Indexed注解而生成的。同时,由于在Redis数据库中生成了对应属性的二级索引,所以可以通过二级索引来查询具体的数据信息,例如repository.findByAddress_City("北京")通过address.city索引查询索引值为北京的数据信息。如果没有设置对应属性的二级索引,那么通过属性索引查询的数据结果将为空。

SpringBoot数据访问(三) SpringBoot整合Redis的更多相关文章

  1. SpringBoot进阶教程(三十)整合Redis之Sentinel哨兵模式

    Redis-Sentinel是官方推荐的高可用解决方案,当redis在做master-slave的高可用方案时,假如master宕机了,redis本身(以及其很多客户端)都没有实现自动进行主备切换,而 ...

  2. SpringBoot数据访问之整合mybatis注解版

    SpringBoot数据访问之整合mybatis注解版 mybatis注解版: 贴心链接:Github 在网页下方,找到快速开始文档 上述链接方便读者查找. 通过快速开始文档,搭建环境: 创建数据库: ...

  3. SpringBoot数据访问之Druid启动器的使用

    数据访问之Druid启动器的使用 承接上文:SpringBoot数据访问之Druid数据源的自定义使用 官方文档: Druid Spring Boot Starter 首先在在 Spring Boot ...

  4. SpringBoot数据访问(一) SpringBoot整合Mybatis

    前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...

  5. SpringBoot数据访问(二) SpringBoot整合JPA

    JPA简介 Spring Data JPA是Spring Data大家族的一部分,它可以轻松实现基于JPA的存储库.该模块用于增强支持基于JPA的数据访问层,它使我们可以更加容易地构建使用数据访问技术 ...

  6. 展开被 SpringBoot 玩的日子 《 三 》 整合Redis

    SpringBoot对常用的数据库支持外,对NoSQL 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构 ...

  7. SpringBoot(三)整合Redis

    spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...

  8. Springboot数据访问,棒棒哒!

    Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...

  9. SpringBoot进阶教程(二十七)整合Redis之分布式锁

    在之前的一篇文章(<Java分布式锁,搞懂分布式锁实现看这篇文章就对了>),已经介绍过几种java分布式锁,今天来个Redis分布式锁的demo.redis 现在已经成为系统缓存的必备组件 ...

随机推荐

  1. 建站第二步:简单配置Nginx反代理工具

    简单配置Nginx反代理工具 你要用你的域名能和服务器绑定就要用一些反代理工具 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,极其优异的服务器软件,底层为C 来自某些 ...

  2. [bug] Your password does not satisfy the current policy requirements

    参考 https://blog.csdn.net/zhanaolu4821/article/details/93622812

  3. property - 必应词典 美['prɑpərti]英['prɒpə(r)ti] n.属性;财产;财产权;【戏】道具

    英语 (已检测) 自动检测 阿拉伯语 自动检测 爱尔兰语 自动检测 爱沙尼亚语 自动检测 保加利亚语 自动检测 冰岛语 自动检测 波兰语 自动检测 波斯尼亚语(拉丁语) 自动检测 波斯语 自动检测 丹 ...

  4. Ansible_编写Playbook文件

    一.Playbook的实施 1.Ansible playbook与临时命令概述: 临时命令可以作为一次性命令对一组目标主机运行一项简单的任务 play是针对清单中选定的主机运行的一组有序任务.play ...

  5. 华为鲲鹏处理器实现商用,Arm服务器又添砝码

    华为鲲鹏处理器实现商用,Arm服务器又添砝码 鲲鹏920就是华为海思1620 鲲鹏920面向 服务器CPU就是 华为海思162064core 武汉华为PC不是海思1620是另一个cpu 深圳华为PC的 ...

  6. LTP--linux稳定性测试 linux性能测试 ltp压力测试 内核更新 稳定性测试

    LTP--linux稳定性测试 linux性能测试 ltp压力测试 zhangzj1030关注14人评论33721人阅读2011-12-09 12:07:45   说明:在写这篇文章之前,本人也不曾了 ...

  7. http协议工作原理及工作流程

    什么是url ? url = 协议 + 域名 + 资源路径 比如: https://www.baidu.com/index.html http : 超文本传输协议 https: 安全套接字协议 HTT ...

  8. Linux进阶之综合练习

    综合练习: 1.准备2台centos7系统的服务器,远程互相免密登录,以下所有题目过程中开启防火墙 2.给1号机和2号机使用光盘搭建本地yum源(永久生效) 3.给服务器1添加2块硬盘,1块1GB,1 ...

  9. DOCKER学习_016:Docker镜像仓库和HARBOR的简单安装和管理

    一 镜像仓库介绍 1.1 简介 镜像仓库用于存放 Docker镜像 Docker registry提供镜像仓库服务 一个 Docker registry可以包含多个镜像仓库 仓库分为公共镜像仓库与私有 ...

  10. Java public 和 private 访问修饰符

    何为封装 从事面向对象编程的 Java 程序员,不可能不知道封装,它是面向对象编程的精髓,非常重要. 那什么是封装?字面意思就是把摆在外面的东西包起来. 一句话,封装就是对外隐藏内部细节. 那为何要封 ...