Redis|Springboot集成Redis

文章目录

    • 总体概述
    • 本地Java连接Redis常见问题
    • 集成Jedis
    • 集成lettuce
    • 集成RedisTemplate——推荐使用
      • 连接单机
      • 连接集群

在这里插入图片描述

总体概述

  • jedis-lettuce-RedisTemplate三者的联系
    • jedis第一代
    • lettuce承上启下
    • redistemplate着重使用

本地Java连接Redis常见问题

  • bind配置请注释掉
  • 保护模式设置为no
  • Linux系统的防火墙设置
  • Redis服务器的IP地址和密码是否正确
  • 忘记写访问redis的服务端口号和auth密码

集成Jedis

  • 是什么:Jedis Client是Redis官网推荐的一个面向Java客户端,库文件实现了对各类API进行封装调用
  • 步骤
    1. 建Module
    2. 改POM.xml
    3. 写application.yaml
    4. 主启动
    5. 业务类
<?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>2.7.11</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.luojia</groupId><artifactId>redis7_study</artifactId><version>0.0.1-SNAPSHOT</version><name>redis7_study</name><description>Demo project for Spring Boot</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version></properties><dependencies><!--SpringBoot 通用依赖模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency><!-- 通用基础配置 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
server.port=7777
spring.application.name=redis7_study

在这里插入图片描述在这里插入图片描述

集成lettuce

  • 是什么:Lettuce是一个Redis的Java驱动包,Lettuce翻译为生菜,就是吃的那种生菜

  • lettuce VS Jedis在这里插入图片描述

  • 改POM在这里插入图片描述

  • 业务类在这里插入图片描述在这里插入图片描述

集成RedisTemplate——推荐使用

连接单机

  • boot整合Redis基础演示
  • 建module:redis7_study
  • 改pom
<!-- SpringBoot 与Redis整合依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!-- swagger2 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency>
  • 写YML
server.port=7777spring.application.name=redis7_study# ===========================logging===========================
logging.level.root=info
logging.1evel.com.luojia.redis7_study.redis7=info
1ogging.pattern.console=%d{yyyy-MM-dd HH:m:ss.SSS} [%thread] %-5level %1ogger- %msg%n1ogging.file.name=F:\workspace\数据结构和算法\Learning-in-practice\Redis\redis7-study
1ogging.pattern.fi1e=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger- %msg%n# ===========================swagge===========================
spring.swagger2.enabled=true
#在springboot2.6.X结合swagger2.9.X会提示documentationPluginsBootstrapper空指针异常,
#原因是在springboot2.6.X中将SpringMVC默认路径匹配策略MAntPathMatcher更改为athPatternParser,
#导致出错,解决办法是matching-strategy 切换回之前ant_path_matcher
spring.mvc.pathmatch.matching-strategy=ant_path_matcher# ===========================redis单机===========================
spring.redis.database=0
#修改为自己真实IP
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.lettuce.pool.max-active=8
spring.redis.1ettuce.pool.max-wait=-1ms
spring.redis.1ettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
  • 主启动在这里插入图片描述
  • 业务类-配置类
// RedisConfig
package com.luojia.redis7_study.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;@Configuration
public class RedisConfig {/*** *redis序列化的工具定置类,下面这个请一定开启配置* *127.0.0.1:6379> keys ** *1) “ord:102” 序列化过* *2)“\xaclxedlxeelx05tixeelaord:102” 野生,没有序列化过* *this.redisTemplate.opsForValue(); //提供了操作string类型的所有方法* *this.redisTemplate.opsForList();// 提供了操作List类型的所有方法* *this.redisTemplate.opsForset(); //提供了操作set类型的所有方法* *this.redisTemplate.opsForHash(); //提供了操作hash类型的所有方认* *this.redisTemplate.opsForZSet(); //提供了操作zset类型的所有方法* param LettuceConnectionFactory* 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());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}
// SwaggerConfig
package com.luojia.redis7_study.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.time.LocalDate;
import java.time.format.DateTimeFormatter;@Configuration
@EnableSwagger2
public class SwaggerConfig {@Value("${spring.swagger2.enabled}")private Boolean enabled;@Beanpublic Docket createRestApi() {return new Docket (DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(enabled).select().apis(RequestHandlerSelectors.basePackage("com.luojia.redis7_study.config")) //你自己的package.paths (PathSelectors.any()).build();}public ApiInfo apiInfo() {return new ApiInfoBuilder().title("springboot利用swagger2构建api接口文档 "+"\t"+ DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDate.now())).description( "springboot+redis整合" ).version("1.0").termsOfServiceUrl("https://github.com/Romantic-Lei").build();}}
  • 业务类-service
package com.luojia.redis7_study.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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 OrderService {@Autowiredprivate RedisTemplate redisTemplate;public static final String ORDER_KEY="ord:";public void addOrder() {int keyId = ThreadLocalRandom.current().nextInt(1000) + 1;String serialNo = UUID.randomUUID().toString();String key = ORDER_KEY+keyId;String value = "JD" + serialNo;redisTemplate.opsForValue().set(key, value);log.info("***key:{}", key);log.info("***value:{}", value);}public String getOrderById(Integer keyId) {return (String)redisTemplate.opsForValue().get(ORDER_KEY+keyId);}
}
  • 业务类-controller
package com.luojia.redis7_study.controller;import com.luojia.redis7_study.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
@Api(tags="订单接口")
public class OrderController {@Autowiredprivate OrderService orderService;@ApiOperation("新增订单")@PostMapping("/order/add")public void addOrder() {orderService.addOrder();}@ApiOperation("根据keyId查询订单")@GetMapping("/order/query")public String queryOrder(Integer keyId) {return orderService.getOrderById(keyId);}}
  • 测试
    • 项目启动,连接swagger:http://localhost:7777/swagger-ui.html
    • 序列化问题在这里插入图片描述
    • 为什么会这样?RedisTemplate使用的是JDK序列化方式(默认)惹的祸在这里插入图片描述
      在这里插入图片描述在这里插入图片描述

连接集群

  • 启动Redis集群6台实例
  • 第一次改写YML
# ===========================redis集群===========================
spring.redis.password=111111
# 获取失败 最大重定向次数
spring.redis.cluster.max-redirects=3
spring.redis.lettuce.pool.max-active=8
spring.redis.1ettuce.pool.max-wait=-1ms
spring.redis.1ettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
spring.redis.cluster.nodes=192.168.111.175:6381,192.168.111.175:6382,192.168.111.176:6383,192.168.111.176:6384
  • 直接通过微服务访问Redis集群:一切正常 (http://localhost:7777/swagger-ui.html)
  • 问题来了:
    1. 人为模拟,master-6381机器意外宕机,手动shutdown
    2. 先对redis集群用命令的方式,手动验证各种读写命令,看看6384是否上位
    3. Redis Cluster集群能自动感知并自动完成主备切换,对应的slave6384会被选举为新的master节点
    4. 通过redis客户端连接6384可以正常进行读写操作
    5. 微服务客户端再次读写访问试试
      • 故障现象

        • SpringBoot客户端没有动态感知RedisCluster的最新集群信息
        • 经典故障-故障演练:Redis Cluster集群部署采用了3主3从拓扑结构,数据读写访问master节点,slave节点负责备份。当master宕机主从切换成功,redis手动OK,but 2个经典故障在这里插入图片描述
      • 导致原因:SpringBoot 2.X版本,Redis默认的连接池采用Lettuce,当Redis集群节点发生变化后,Letture默认是不会刷新节点拓扑

      • 解决方案

        1. 排除lettuce采用Jedis(不推荐)在这里插入图片描述
        2. 修改源码,重写连接工厂实例(极度不推荐)
        3. 刷新节点集群拓扑动态感应在这里插入图片描述
          • 解决方法:
            • 调用 RedisClusterClient.reloadPartitions
            • 后台基于时间间隔的周期刷新
            • 后台基于持续的断开和移动、重定向的自适应更新
      • 第二次改写YML在这里插入图片描述

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

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

相关文章

机器学习(六)

一&#xff0c;决策树&#xff1a; 简介&#xff1a; 决策树是一种通过构建类似树状的结构&#xff08;颠倒的树&#xff09;&#xff0c;从根节点开始逐步对数据进行划分&#xff0c;最终在叶子节点做出预测结果的模型。 结构组成&#xff1a; 根节点&#xff1a;初始的数据集…

恢复IDEA的Load Maven Changes按钮

写代码的时候不知道点到什么东西了&#xff0c;pom文件上的这个弹窗就是不出来了&#xff0c;重启IDEA&#xff0c;reset windos都没用&#xff0c;网上搜也没收到解决方案 然后开打开其他项目窗口时&#xff0c;看到那个的功能名叫 Hide This Notification 于是跑到Setting里…

怎么使用Sam Helper修改手机屏幕分辨率,使得游戏视野变广?

1.准备Shizuku 和Sam Helper软件 2.打开设置&#xff0c;找到关于本机&#xff0c;连续点击版本号五次打开开发者选项 3.找到开发者选项&#xff0c;打开USB调试和无线调试 4.返回桌面&#xff0c;我们接着打开shizuku,点击配对&#xff0c;这里打开开发者选项&#xff0c;找…

【招聘精英】

我们公司是一个位于石家庄的一个科技型新型技术公司。主要做人力资源、用工、科技等方面。 有意向回石家庄的或者已经在石家庄的技术大咖、软件大牛、产品大佬、UI大神可以来了解一下。 现在招聘 高级前端开发 高级java开发 其他岗位也可以联系。 有意向的朋友可以私信我。 -…

大模型信息整理

1. Benchmarks Reasoning, conversation, Q&A benchmarks HellaSwagBIG-Bench HardSQuADIFEvalMuSRMMLU-PROMT-BenchDomain-specific benchmarks GPQAMedQAPubMedQAMath benchmarks GSM8KMATHMathEvalSecurity-related benchmarks PyRITPurple Llama CyberSecEval2. 国内外…

Redis-限流方案

在实际业务中&#xff0c;可能会遇到瞬时流量剧增的情况&#xff0c;大量的请求可能会导致服务器过载和宕机。为了保护系统自身和上下游服务&#xff0c;需要采用限流的方式&#xff0c;拒绝部分请求。 限流就是对请求的频率进行控制&#xff0c;迅速拒绝超过请求阈值的请求。 …

无感方波开环强拖总结

一、强拖阶段的核心原理与设计要点 开环换相逻辑 固定频率斜坡&#xff1a;以预设斜率逐步提升换相频率&#xff08;如0.5-5Hz/ms&#xff09;&#xff0c;强制电机跟随磁场旋转。电压-频率协调控制&#xff1a;初始阶段施加高电压&#xff08;80%-100%额定&#xff09;克服静摩…

Java虚拟机之垃圾收集(一)

目录 一、如何判定对象“生死”&#xff1f; 1. 引用计数算法&#xff08;理论参考&#xff09; 2. 可达性分析算法&#xff08;JVM 实际使用&#xff09; 3. 对象的“缓刑”机制 二、引用类型与回收策略 三、何时触发垃圾回收&#xff1f; 1. 分代回收策略 2. 手动触发…

代码随想录算法训练营第22天 | 组合 组合总和 电话号码的字母组合

77. 组合 77. 组合 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<Integer> path new ArrayList<>();List<List<Integer>> result new ArrayList<>();public void backTracking(int n,int k,int startIndex){if(path.size() …

#UVM# 关于field automation机制中的标志位及if的使用

通过前面文章的复习,我们知道了 uvm_field 机制带来的好处,确实方便了我们很多代码的coding 时间,但是会不会有一种情况呢? 比如,我们不想将实例中的某一些成员进行打包、复制、比较操作,怎么办呢? 如果只执行 比较但不进行打包操作呢?是不是很复杂呢 ? 一 标志位…

RK3588 安装ffmpeg6.1.2

在安装 ffmpeg 在 RK3588 开发板上时,你需要确保你的开发环境(例如 Ubuntu、Debian 或其他 Linux 发行版)已经设置好了交叉编译工具链,以便能够针对 RK3588 架构编译软件。以下是一些步骤和指导,帮助你安装 FFmpeg: 1. 安装依赖项 首先,确保你的系统上安装了所有必要的…

leetcode day25 28 KMP算法

28找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff…

编程语言介绍:Rust

什么是Rust Rust是由Mozilla研究院开发的一种系统级编程语言&#xff0c;旨在提供更好的内存安全保证&#xff0c;同时保持高性能&#xff0c;自2010年首次发布以来&#xff0c;Rust以其安全性、并发性和实用性迅速获得了广泛的关注。Rust最独特的特性之一是其所有权模型&#…

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭&#xff1a; Request Controller&#xff08;接单员&#xff09;&#xff1a;负责处理你的点餐请求&#xff0c;记录你的口味、桌号等信息。Response Controller&#xff08…

Oracle 字符类型对比

本文以 Oracle12c 为例 1.主要区别对比 类型存储方式最大长度字符集支持适用场景备注​CHAR(M)固定长度空格填充2000 字节&#xff0c;M 代表字节长度默认字符集固定长度编码实际存储长度固定为定义长度&#xff08;如 CHAR(10) 始终占 10 字节&#xff09;​VARCHAR2(M)可变长…

Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露

一&#xff1a;背景 1. 讲故事 前面跟大家分享过一篇 C# 调用 C代码引发非托管内存泄露 的文章&#xff0c;这是一个故意引发的正向泄露&#xff0c;这一篇我们从逆向的角度去洞察引发泄露的祸根代码&#xff0c;这东西如果在 windows 上还是很好处理的&#xff0c;很多人知道开…

vite.config.js 是Vite 项目的配置文件,分析具体用法

vite.config.js 是 Vite 项目的配置文件&#xff0c;用于定义项目的构建、开发服务器、插件等配置选项。以下是示例代码中各部分的作用分析&#xff1a; 1. 导入模块 import { fileURLToPath, URL } from node:url import { defineConfig } from vite import vue from vitejs…

行为模式---责任链模式

概念 责任链模式是一种行为设置模式&#xff0c;它的核心思想就是将请求的发送者和接收者进行解耦&#xff0c;每个接收者都可以处理请求。 在责任链模式中将每个接收者连成一个链条&#xff0c;当有请求发送上来的时候会经过每一个接收者。直到消息被处理。 适用场景 1、当…

pytest结合allure

Allure 一、文档二、指令三、装饰器3.1 allure.step装饰器3.2 allure.description装饰器3.3 allure.title装饰器3.4 allure.link、allure.issue 和 allure.testcase装饰器3.5 allure.epic、allure.feature 和 allure.story装饰器3.6 allure.severity装饰器 一、文档 allure文档…

前端知识点---http.createHttp()的理解(arkts)

通俗易懂的例子&#xff1a;点外卖 &#x1f354;&#x1f964; 想象一下&#xff0c;你在家里点外卖&#xff0c;HTTP 请求就像是你和餐厅之间的沟通方式。 1️⃣ 没有 http.createHttp()&#xff1a;每次点餐都重新拨电话 &#x1f4de; 如果你每次点餐都重新拨打餐厅的电话…