32、Redis 7系列:Spring Boot集成Redis

32、Redis 7系列:Spring Boot集成Redis

  • 一、前言
  • 二、集成 RedisTemplate
    • 1、单机
      • (1)新建项目
      • (2)修改pom文件
      • (3)修改yml文件
      • (4)启动类
      • (5)配置类
      • (6)业务类
      • (6)测试
    • 2、集群
      • (1)启动6台Redis实例(3主3从)
      • (2)修改yml文件
      • (3)测试(3主3从正常运行情况)
      • (4)测试(3主3从其中某台master突发宕机)
      • (5)拓展(根据上文测试)

一、前言

本文只有集成 RedisTemplate ,也是市面上最推荐使用的。
集成 Jedis 和集成 lettuce 已经被淘汰,所以不做过多赘述~

二、集成 RedisTemplate

1、单机

(1)新建项目

此案例新建 spring boot 项目(新建 maven 项目也可以,不过需要手动添加基础pom依赖)
在这里插入图片描述

(2)修改pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.ulanhada</groupId><artifactId>redis</artifactId><version>0.0.1-SNAPSHOT</version><name>redis</name><description>redis</description><!-- 依赖版本 --><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><lombok.version>1.18.30</lombok.version><log4j.version>1.2.17</log4j.version></properties><dependencies><!--SpringBoot通用依赖模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--SpringBoot与Redis整合依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- spring boot 2.5.x后不需要引入Apache Commons Pool2 -->
<!--        <dependency>-->
<!--            <groupId>org.apache.commons</groupId>-->
<!--            <artifactId>commons-pool2</artifactId>-->
<!--        </dependency>--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

(3)修改yml文件

server:port=8080spring:application:name: redisdata:redis:database: 0host: 192.168.250.130port: 6379password: 123456lettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0# ========================logging=====================
logging:level:root: infocom.ulanhada.redis: infopattern:console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger- %msg%n'file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger- %msg%n'file:name: E:/redis/log/redis.log

(4)启动类

package com.ulanhada.redis;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class RedisApplication {public static void main(String[] args) {SpringApplication.run(RedisApplication.class, args);}
}

(5)配置类

package com.ulanhada.redis.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** @Description: // Redis序列化配置类* @Author: chnmayan* @Date: 2024-03-05 10:30*/
@Configuration
public class RedisConfig {/*** @param lettuceConnectionFactory: 将配置文件中的redis配置,注入进工厂中。* @return*/@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(lettuceConnectionFactory);//设置所有key序列化方式StringredisTemplate.setKeySerializer(new StringRedisSerializer());//设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());// 设置Hash的键(field)的序列化方式,只对Hash的field生效redisTemplate.setHashKeySerializer(new StringRedisSerializer());// 设置Hash的值(value)的序列化方式,只对Hash的value生效redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}

(6)业务类

UserController

package com.ulanhada.redis.controller;import com.ulanhada.redis.service.UserService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class UserController {@ResourceUserService userService;@RequestMapping(value = "/user/add",method = RequestMethod.POST)public void addUser() {userService.addUser();}@RequestMapping(value = "/order/{userKey}", method = RequestMethod.GET)public String queryUserById(@PathVariable Integer userKey) {return userService.queryUserById(userKey);}
}

UserService

package com.ulanhada.redis.service;import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;@Service
@Slf4j
public class UserService {public static final String USER_KEY = "userKey:";@Resourceprivate RedisTemplate redisTemplate;public void addUser() {int userKey = ThreadLocalRandom.current().nextInt(1000);String userValue = UUID.randomUUID().toString().replace("-", "").toUpperCase();redisTemplate.opsForValue().set(USER_KEY + userKey,"用户ID:"+ userValue);log.info("======用户key:" + userKey + "; 用户ID:" + userValue);}public String queryUserById(Integer userKey) {return (String) redisTemplate.opsForValue().get(USER_KEY + userKey);}
}

(6)测试

第一步:无Redis配置类
首先启动项目。然后输入测试 url:localhost:8080/user/add
在这里插入图片描述
控制台输出:
在这里插入图片描述
登录 Redis 客户端验证:
为了更清楚的看清序列化,本次登录 Redis 客户端方式采用普通登录方式(不支持中文)。用 支持中文的方式 登录 Redis 客户端,会出现乱码。
在这里插入图片描述
上图说明数据已经新增成功。但是数据出现了序列化问题。
出现该问题的原因:
Redis 的键(key)和值(value)都是通过 Spring 提供的 Serializer 序列化到数据库的。
RedisTemplate 默认使用的是 JdkSerializationRedisSerializer
在这里插入图片描述
在这里插入图片描述
解决办法一:
编码中不使用 RedisTemplate ,改为 StringRedisTemplate
在这里插入图片描述
由于 StringRedisTemplate 已经指定了序列化方式,所以可以正常使用。不过该方法只能 String 的数据使用,其他数据类型不能使用。

解决办法二(推荐):
新建 Redis序列化配置类 。配置类内容见本文 (5)配置类
手动删除上一条数据,语法:del [key]
postman 重新新增一条数据,再次登录客户端验证。

# 语法:--raw: Redis客户端支持中文
redis-cli -a 123456 -p 6379 --raw

在这里插入图片描述

2、集群

(1)启动6台Redis实例(3主3从)

集群搭建不再赘述,不了解的小伙伴可以参考如下文章:
31、Redis 7系列:集群(cluster)
注意:登录客户端命令需要添加:-c--raw

redis-cli -a 123456 -p 6381 -c --raw

在这里插入图片描述

(2)修改yml文件

yml文件Redis配置修改为集群

    redis:password: 123456lettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0cluster:max-redirects: 3 # 获取失败 最大重定向次数nodes: 192.168.250.130:6381,192.168.250.130:6382,192.168.250.131:6383,192.168.250.131:6384,192.168.250.132:6385,192.168.250.132:6386

(3)测试(3主3从正常运行情况)

启动项目,并新增一条数据。
在这里插入图片描述

(4)测试(3主3从其中某台master突发宕机)

上文测试虽然新增成功,实则暗藏隐患。
如果当其中一台 master宕机 ,会出现什么情况?接下来做个深度测试。

  • 模拟 master-6381 服务器突发宕机
    执行 shutdown 命令

  • 查看集群信息
    发现 6384实例 原本是 6381实例slave 。目前已经变成 master
    在这里插入图片描述

  • 验证Redis客户端
    集群功能一切正常。
    在这里插入图片描述

  • 验证Spring Boot服务端
    由于本案例是基于Spring Boot 3.x,所以测试一切正常。
    在这里插入图片描述在这里插入图片描述

(5)拓展(根据上文测试)

本案例 Redis Cluster 集群部署采用了 3主3从拓扑结构 。数据读写访问 master 节点, slave 节点负责备份。当 master 宕机主从切换成功,Redis客户端 操作一切正常,Spring Boot服务端 会根据Spring Boot版本 的不同出现如下问题。
在这里插入图片描述

  • Spring Boot 1.x 版本环境
    Spring Boot 1.x 之前版本默认使用 jedis ,无需手动开启动态刷新。
  • Spring Boot 2.0~2.3 版本环境
    Spring Boot 2.0~2.3 版本默认使用 lettuce,默认不支持属性配置集群拓扑刷新。
  • Spring Boot 2.3之后 版本环境
    Spring Boot 2.3版本 之后版本默认使用 lettuce,默认支持属性配置开启集群拓扑刷新。
  • Spring Boot 3.x以后 版本环境
    默认动态的刷新集群拓扑感应。

解决办法:

  • 排除**lettuce** ,使用 jedis。更改pom文件(不推荐)
  • 重写连接工厂实例。(极度不推荐)
  • 动态的刷新集群拓扑感应。(推荐)
# 修改配置文件
spring:redis:lettuce:cluster:refresh-enabled: true #支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关闭refresh-period: 2000 #定时刷新

到这里 Redis 7系列:Spring Boot集成Redis 就结束了!!!🎉🎉🎉
欢迎小伙伴们学习和指正!!!😊😊😊
祝大家学习和工作一切顺利!!!😎😎😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270493.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.初识python

1.初识python 编程语言是用来定义计算机程序的语言&#xff0c;用来向计算机发出指令。 1.python语言是一种面向对象的解释型高级编程语言。 解释型语言&#xff1a;使用专门的解释器对源码程序逐行解释成特定平台的机器并立即执行&#xff0c;是代码在执行时才被解释器一行行…

centos7 部署kibana

先决条件参考 虚拟机部署elasticsearch集群-CSDN博客 这里使用elk101服务器安装kibana 下载rpm包(这里添加了-c参数用到wget的断点续传功能) #下载kibana-rpm包以及校验文件 wget -c https://artifacts.elastic.co/downloads/kibana/kibana-7.17.18-x86_64.rpm wget -c htt…

尤雨溪:Vue 未来展望新的一轮

十年&#xff0c;一个既漫长又短暂的时光跨度&#xff0c;对于技术世界来说&#xff0c;更是沧海桑田的瞬间。在这十年里&#xff0c;Vue.js 从无到有&#xff0c;从默默无闻到蜚声全球&#xff0c;不仅改变了前端开发的面貌&#xff0c;更成为了无数开发者手中的得力工具。 在…

设计模式之策略模式实践

设计模式之策略模式实践 先了解一下策略模式的定义是什么&#xff1f;解决什么问题 策略模式是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装成一个类&#xff0c;并使它们可以互相替换。策略模式允许客户端在运行时从可互换的算法中选择一个&a…

【论文精读】TextDiffuser-2:释放语言模型用于文本渲染的力量

文章目录 一、前言二、摘要三、方法&#xff08;一&#xff09;TextDiffuser-2模型的整体架构&#xff08;二&#xff09;语言模型M1将用户提示转换为语言格式的布局&#xff08;三&#xff09;将提示和布局结合到扩散模型内的可训练语言模型M2中进行编码以生成图像 四、实验&a…

基于单片机的数字温度计设计

目 录 摘 要 I Abstract II 引 言 1 1 整体方案设计 3 1.1 主控芯片类型选择 3 1.2 测温电路选择 3 1.3 系统总体方案 4 2 系统的硬件电路设计 5 2.1 单片机系统设计 5 2.2 显示模块设计 8 2.3 温度读取电路的设计 10 3 系统软件设计 13 3.1 软件开发环境的介绍 13 3.2 系统重…

ubuntu_定制文件系统[2]-清理日志log

1.问题现象 系统长时间运行, 产生大量的系统日志 ubuntu/debian 系统日志如下 /var/log$ du -sh * 31M syslog # syslog日志 61M syslog.1 2.5G journal/ # systemd service日志 当日志文件过大, 硬盘空间占用100%时, 导致各种异常 命令按tab补全无响应服务/进程启动异常服务…

Docker之若依项目部署

目录 一、搭建项目的局域网 1.1搭建局域网 1.2查看局域网 1.3注意&#xff1a;要关闭防火墙&#xff0c;关闭后要重启docker 二、redis安装 2.1创建目录 2.2修改redis.conf文件 三、MySQL安装 3.1安装 3.2设置远程连接 3.3创建数据库 四、若依后端项目搭建 4.1创建…

挑战杯 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的植物识别算法 ** …

Xilinx高级调试方法--远程调试

Xilinx高级调试方法--远程调试 1 虚拟电缆调试2 FPGA设计2.1 扩展配置接口 3 PCIe-XVC驱动3.1 PCIe-XVC驱动3.2 XVC-Server 4 Vivado Design Suite4.1 同一台主机4.2 不同主机 本文主要介绍Xilinx的一些高级调试方法&#xff0c;以及如何使用Xilinx的相关IP。 1 虚拟电缆调试 …

Java基础知识点

Java基础知识点 1.方法重载和重写的区别 方法重载&#xff1a; 同一个类中的方法&#xff0c;方法名相同&#xff0c;返回值可以相同可以不同&#xff0c;参数列表必须不同发生在编译期&#xff0c;在编译期确定执行哪个方法 方法重写&#xff1a; 指的是子类重新定义父类…

探索c++——了解c++的魅力

前言&#xff1a;c是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c该特性的原因是c是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c&#xff0c; 身具面向过程的特性。 又有本身的面向对象的特性。 面向对象和…

Wireshark_labs TCP

在本实验中&#xff0c;我们将详细研究著名的TCP协议的行为。我们将通过从您的电脑向远程服务器传输一份150KB 的文件(一份Lewis Carrol 的“爱丽丝梦游仙境”文本)&#xff0c; 并分析TCP传输内容的发送和接收过程来实现。我们将研究TCP对序列和确认号的使用&#xff0c;以提供…

Python 系统学习总结(基础语法+函数+数据容器+文件+异常+包+面向对象)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 六天时间系统学习Python基础总结&#xff0c;目前不包括可视化部分&#xff0c;其他部分基本齐全&#xff0c;总结记录&#xff0…

Python与FPGA——膨胀腐蚀

文章目录 前言一、膨胀腐蚀二、Python实现腐蚀算法三、Python实现膨胀算法四、Python实现阈值算法五、FPGA实现腐蚀算法总结 前言 腐蚀是指周围的介质作用下产生损耗与破坏的过程&#xff0c;如生锈、腐烂等。而腐蚀算法也类似一种能够产生损坏&#xff0c;抹去部分像素的算法。…

SoundTouch对音频处理(Android)

SoundTouch对音频处理&#xff08;Android&#xff09; SoundTouch介绍 SoundTouch 是一个用于音频处理的开源库&#xff0c;主要用于改变音频的速度、音调和音量等特征。您可以在项目中使用 SoundTouch 库来实现音频处理的功能&#xff0c;比如变速播放、音高变化、混响效果…

Redis(5.0)

1、什么是Redis Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库&#xff0c;它同时也提供了多种数据结构来满足不同场景下的数据存储需求。 2、安装Redis&#xff08;Linux&#xff09; 2.1、去官网&#xff08;http://www.redis.cn/&#xff09;下…

新品发布会注意事项有哪些?如何邀约媒体到场发布

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 新品发布会的注意事项以及邀约媒体到场发布的方法如下&#xff1a; 一、新品发布会注意事项&#xff1a; 明确活动目的和主题&#xff1a;确定新品发布会要传达的信息和目标&#xff0c;…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TapGesture)

支持单击、双击和多次点击事件的识别。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 TapGesture(value?: { count?: number, fingers?: number }) 参数&#xff1a; 参数名称参数类型必填参…

数学建模【模糊综合评价分析】

一、模糊综合评价分析简介 提到模糊综合评价分析&#xff0c;就先得知道模糊数学。1965年美国控制论学家L.A.Zadeh发表的论文“Fuzzy sets”标志着模糊数学的诞生。 模糊数学又称Fuzzy数学&#xff0c;是研究和处理模糊性现象的一种数学理论和方法。模糊性数学发展的主流是在…