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.pswp.cn/web/71698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71698.shtml
英文地址,請注明出處:http://en.pswp.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; 如果你每次點餐都重新撥打餐廳的電話…