Redis-08 SpringBoot集成Redis常見問題

? ? ? ? SpringBoot集成Redis的教程網上很多,總體來說就是三個步驟:添加依賴、修改配置文件、自定義Redis配置類(自定義序列化器),具體步驟可自行搜索,本文主要解惑集成中的常見疑問。

1,選擇什么依賴?

? ? ? ? SpringBoot集成Redis共有三種依賴可選:spring-boot-starter-data-redis,spring-data-redis,redisson-spring-boot-start。先說結果:

????????優先選擇 ??spring-boot-starter-data-redis??,快速實現緩存功能,避免過度設計。

????????高并發或分布式系統??,直接使用 ??redisson-spring-boot-starter??,其內置的分布式鎖、限流器可顯著降低復雜度。

? ? 1),spring-boot-starter-data-redis(官方推薦)

????????定位??:Spring Boot官方提供的開箱即用方案,封裝了Spring Data Redis的核心功能。
??????????底層客戶端??:默認使用Lettuce(基于Netty的非阻塞I/O),也可切換為Jedis(傳統阻塞式I/O)。
??????????核心優勢??:
??????????????????自動化配置??:僅需配置spring.redis.host/port等參數即可自動初始化連接池和RedisTemplate。
??????????????????統一操作接口??:提供RedisTemplate和StringRedisTemplate,支持字符串、哈希、列表等數據結構操作。
??????????????????與Spring生態無縫集成??:支持Spring Cache抽象、事務管理和Repository模式。
??????????局限性??:
????????????????高級功能(如分布式鎖、限流)需自行實現(如Lua腳本或第三方庫)。
????????????????默認序列化方式為JDK序列化(可讀性差),需手動配置JSON序列化。
? ? ? ? 適用場景:簡單緩存、基礎數據操作
????????性能:中等(依賴Lettuce/Jedis)
????????高級功能:需自行實現

? ? 2),spring-data-redis

????????非SpringBoot項目(如Springmvc,Spring)引入的依賴,不包含客戶端、連接池,需手動配置連接工廠。spring-boot-starter-data-redis??已包含?? spring-data-redis。

? ? 3),redisson-spring-boot-start(分布式redis依賴)

????????定位??:Redisson提供的增強方案,支持分布式對象和高級分布式功能。
????????核心優勢??:
????????????????開箱即用的分布式工具??:內置分布式鎖(支持自動續期)、信號量、限流器(RRateLimiter)、延遲隊列等。
????????高性能本地緩存??:通過RLocalCachedMap減少網絡IO,緩存命中率提升顯著(壓測可達百萬級QPS)。
????????異步與響應式支持??:基于Netty的非阻塞通信,支持RBatch批量操作提升吞吐量。
????????局限性??:
????????????????學習成本高,需理解分布式對象(如RMap、RBucket)的API設計。
????????????????部分簡單操作(如基礎字符串存取)代碼量略多于RedisTemplate。
????????適用場景:分布式鎖、限流、高并發系統
????????性能:高于spring-boot-starter-data-redis,基于Netty異步+本地緩存優化
????????高級功能:內置分布式工具

2,多模塊怎么將Redis配置文件和配置類獨立出來,避免各模塊重復工作?

  • 微服務系統可將做配置中心;
  • 非微服務系統可設置一個base-module模塊,在需要使用redis的模塊的pom文件中引入該模塊的依賴。

3,為什么要配置Redis連接池,其作用是什么,有哪些連接池可選?

????????Redis連接池(Pool)是指客戶端連接池,是為了管理客戶端(如Jedis或Lettuce)與Redis服務器之間的網絡連接而存在的。

????????Redis服務端可簡單理解成單線程應用(實際非單線程,參考文章Redis-02 單線程與高性能-CSDN博客),無連接池一說。

????????Redis客戶端(即自己的程序,是多線程的)通常是Springboot應用,是多線程的web服務,可同時處理上萬用戶請求,可能產生并發的Redis操作請求,配置客戶端連接池,可在客戶端請求Redis時,減少客戶端連接Redis服務器帶來的創建、銷毀等開銷(如建立tcp連接、tcp斷開、認證等)。

4,RedisTemplate和StringRedisTemplate是什么,有什么區別,生產環境一般怎么使用?

? ? ? ? 科普:

????????它們都是Spring Data Redis提供的核心工具類,用于在Java應用中與Redis服務器進行交互,封裝了底層的連接管理、序列化/反序列化等復雜操作,讓你可以用面向對象的方式操作Redis。

? ? ? ? 區別:

????????核心的區別是默認的序列化器不同。序列化器決定了Java對象如何轉換成二進制數據存入Redis,以及如何從二進制數據變回Java對象。可以把 StringRedisTemplate 看作是 RedisTemplate<String, String> 的一個特例,它強制要求鍵和值都是字符串,并使用字符串序列化器。

RedisTemplate與StringRedisTemplate對比
StringRedisTeplateRedisTeplate
key序列化器StringRedisSerializerJdkSerializationRedisSerializer
value序列化器StringRedisSerializerJdkSerializationRedisSerializer
存儲結果可讀的字符串。set("name", "Alice") 在Redis中存的就是 "Alice"不可讀的JDK序列化字節碼。存進去是亂碼,如 \xac\xed\x00\x05t\x00\x04name
使用場景處理字符串和文本結構的數據處理復雜的Java對象(但需要配置序列化器)

? ? ? ? 生產環境怎么使用:

????????優先使用 StringRedisTemplate 來處理字符串鍵值對。

????????對于需要存儲復雜Java對象的場景,會配置一個專門化的 RedisTemplate(例如 RedisTemplate<String, Object>),并將其值的序列化器改為JSON序列化器(如 Jackson2JsonRedisSerializer 或 GenericJackson2JsonRedisSerializer)。

????????絕對要避免使用默認配置(JDK序列化)的 RedisTemplate!

5,生產環境怎么設置RedisTemplate的序列化器?

? ? ? ? 以常用的GenericJackson2JsonRedisSerializer序列化器為例,生產環境各種配置方式如下:

? ? ? ? 1),簡單快速使用設置

@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 設置Key和HashKey的序列化器為StringRedisSerializertemplate.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());// 設置Value和HashValue的序列化器為GenericJackson2JsonRedisSerializer (JSON格式)GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);template.afterPropertiesSet();return template;}}

? ? ? ? 上述序列化器設置完成即可使用Redis,但是有個弊端,假如存放的是對象,如User(id, name, age, sex, position),在Redis中是Json數據格式,web端獲取User時,返回的是LinkedHashMap<String, Object>,無法直接強轉成User對象。同樣,如果存放的是List<User>,在Redis中是Json數組,返回則是List<LinkedHashMap>。

? ? ? ? 2),優化序列化設置

@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 設置Key和HashKey的序列化器為StringRedisSerializertemplate.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());// 設置Value和HashValue的序列化器為GenericJackson2JsonRedisSerializer (JSON格式),并配置返回序列化類型// 創建 ObjectMapper 并配置多態類型支持/*** 作用:* 這行代碼配置 ObjectMapper 在序列化 JSON 時,自動嵌入類的類型信息。* 這樣在反序列化時,Jackson 就能根據這些信息準確地還原成原始對象類型,而不是簡單的 LinkedHashMap。*/ObjectMapper objectMapper = new ObjectMapper();objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, // 非嚴格驗證,更嚴謹的使用方式是將類型驗證器LaissezFaireSubTypeValidator替換為TypeValidatorObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.PROPERTY);GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);template.afterPropertiesSet();return template;}}

? ? ? ? 如上述代碼,多添加了ObjectMapper,并激活了如下幾個配置:

  • LaissezFaireSubTypeValidator.instance:配置了對象的類型驗證器,允許反序列化任何類型(有安全風險,但操作簡單方便開發)。
  • ObjectMapper.DefaultTyping.NON_FINAL:指定哪些類型需要包含類型信息。NON_FINAL:所有非final類都需要包含類型信息。可選項還有:NON_CONCRETE_AND_ARRAYS(非具體類型和數組), EVERYTHING(所有類型)
  • JsonTypeInfo.As.PROPERTY:指定類型在Redis中如何潛入到JSON里。PROPERTY:作為單獨屬性添加到JSON中。可選項還有:WRAPPER_ARRAY(包裝為數組),WRAPPER_OBJECT(包裝為對象)。

? ? ? ? 添加如上反序列化配置后,假如存放的是List<User>,則Redis中存儲格式如下:

["java.util.ArrayList",[["com.example.User",{"id":1,"name":"張三"}],["com.example.User", {"id":2,"name":"李四"}]]
]

? ? ? ? 客戶端獲取數據時,反序列化就知道該對象是List,內部對象是User,這樣結果就可以直接強轉。

? ? ? ? 3),反序列化類型驗證器

package com.mango.basedata.common;import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 設置Key和HashKey的序列化器為StringRedisSerializertemplate.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());// 設置Value和HashValue的序列化器為GenericJackson2JsonRedisSerializer (JSON格式),并配置返回序列化類型// 創建 ObjectMapper 并配置多態類型支持/*** 作用:* 這行代碼配置 ObjectMapper 在序列化 JSON 時,自動嵌入類的類型信息。* 這樣在反序列化時,Jackson 就能根據這些信息準確地還原成原始對象類型,而不是簡單的 LinkedHashMap。*/ObjectMapper objectMapper = new ObjectMapper();// 創建更安全的類型驗證器(白名單機制)BasicPolymorphicTypeValidator typeValidator = BasicPolymorphicTypeValidator.builder().allowIfSubType("com.example.models.entity").allowIfSubType("java.util.ArrayList").allowIfSubType("java.util.HashMap").build();objectMapper.activateDefaultTyping(typeValidator,ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.PROPERTY);GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);template.afterPropertiesSet();return template;}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95190.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構:選擇排序 (Selection Sort)

目錄 從學生排隊開始 算法的初始狀態和核心操作 代碼的逐步完善 第一階段&#xff1a;定義函數框架和外層循環 第二階段&#xff1a;實現“尋找最小元素”的邏輯&#xff08;內層循環&#xff09; 第三階段&#xff1a;完成“交換”操作 復雜度與特性分析 時間復雜度 (…

Django Admin 管理工具

一、簡介Django Admin 是 Django 框架最受歡迎和強大的特性之一。它是一個自動生成的管理后臺&#xff0c;允許開發者無需或僅需編寫少量代碼&#xff0c;就能對網站的數據模型&#xff08;數據庫中的表&#xff09;進行直觀的增、刪、改、查&#xff08;CRUD&#xff09;操作。…

園區智慧水電管理系統:讓能源管理從“成本黑洞”變“利潤引擎”

園區智慧水電管理系統&#xff0c;是一套專為產業園區、科技園、企業總部等大型空間設計的集智能計量、遠程管控、自動計費、能耗分析于一體的數字化能源解決方案。它用技術手段解決水電管理中的“抄表難、收費亂、浪費多、數據缺”四大頑疾&#xff0c;真正實現降本、提效、控…

DeepSeek應用技巧-通過MCP打造數據分析助手

本文章將通過MCP服務來打造一個數據分析助手&#xff0c;可以直接讀取本地的excel或csv的文件&#xff0c;然后生成可視化的報告并保存在本地&#xff0c;十分有應用和實踐的價值&#xff0c;話不多說&#xff0c;我們開始手把手搭建。一、知識應用&#xff08;1&#xff09;Fu…

React Hooks 完全指南:從基礎到高級的實戰技巧

概述 React Hooks 是 React 16.8 引入的新特性&#xff0c;允許在函數組件中使用狀態和其他 React 特性。根據數據的使用場景和更新機制&#xff0c;可以將 Hooks 分為三大類&#xff1a; 1. 保存只讀數據 useMemo 用途&#xff1a; 緩存計算結果&#xff0c;避免重復計算 …

PCIe 6.0 vs 5.0:帶寬翻倍背后的技術革命

PCIe 6.0 vs 5.0&#xff1a;帶寬翻倍背后的技術革命在數據中心、AI計算和高速存儲需求爆炸式增長的今天&#xff0c;傳統接口帶寬已成為系統性能提升的瓶頸。PCIe 6.0的推出正是為了解決這一挑戰&#xff0c;它通過革命性的技術創新&#xff0c;在保持向后兼容的同時實現了帶寬…

突破傳統企業組網瓶頸:某科技公司智能組網服務項目深度解析

在現代企業的數字化轉型過程中&#xff0c;穩定、高效、安全的網絡基礎設施已成為業務發展的關鍵。然而&#xff0c;傳統組網方案往往面臨諸多挑戰&#xff0c;如網絡性能不足、組網復雜度高、擴展性不佳、以及安全防護薄弱等問題。為了解決這些痛點&#xff0c;某科技公司通過…

ubuntu單機實現10000個連接同時在線測試

連接前 成功連接后 前端測試連接腳本: c_5k.sh !/bin/bash ulimit -n 100000 # client_simulator.sh SERVER_IP="192.168.0.106" SERVER_PORT=8080 MAX_CLIENTS=5000 BATCH_SIZE=100echo "Starting $MAX_CLIENTS clients to $SERVER_IP:$SERVER_PORT"…

防護墻技術(一):NAT

###源NAT基本原理 NAT&#xff08;Network Address Translation&#xff09;網絡地址轉換技術 源NAT技術對IP報文的源地址進行轉換&#xff0c;將私有IP地址轉換為公網IP地址&#xff0c;使大量私網用戶可以利用少量公網IP地址訪問internet&#xff0c;大大減少對公網IP的消耗 …

動態規劃2(c++)

酒鬼#include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;int a[10010];for(int i 1;i<n;i){cin>>a[i];}int dp[1010][5] {0};dp[0][0] 0;dp[1][0] 0;dp[1][1] a[1];dp[1][2] 0;dp[2][0] a[1];dp[2][1] a[2];dp[2][2] a[1]a[…

「LangChain 學習筆記」LangChain大模型應用開發:代理 (Agent)

「LangChain大模型應用開發」 系列文章目錄&#xff1a; LangChain大模型應用開發&#xff1a;模型&#xff0c;提示和輸出解釋器 LangChain大模型應用開發&#xff1a;儲存(Memory) LangChain大模型應用開發&#xff1a;模型鏈&#xff08;Chains&#xff09; LangChain大模…

python pyqt5開發DoIP上位機【介紹】

目錄文章合集一、核心功能概述二、主要模塊解析1. 導入的庫2. 輔助函數3. DOIP協議處理&#xff08;DOIPProtocol類&#xff09;4. 網絡工具&#xff08;NetworkUtils類&#xff09;5. 通信線程&#xff08;DOIPCommunicationThread類&#xff09;6. UDS命令輸入組件&#xff0…

從零實現一個可擴展的規則解析引擎 —— 支持 AND/OR 優先級、短路求值與多類型運算符

在日常業務開發中&#xff0c;我們經常需要基于一些“規則”來決定程序的走向。比如&#xff1a; 客服機器人 根據用戶問題領域和復雜度選擇不同的模型&#xff1b;營銷系統 根據用戶畫像匹配不同優惠券&#xff1b;風控引擎 根據請求參數、時間、分值判定是否放行。 這些規則往…

Preprocessing Model in MPC 3 - 基于同態加密的協議 - Over Rings 環

參考論文&#xff1a;SoK: Multiparty Computation in the Preprocessing Model MPC (Secure Multi-Party Computation) 博士生入門資料。抄襲必究。 本系列教程將逐字解讀參考論文(以下簡稱MPCiPPM)&#xff0c;在此過程中&#xff0c;將論文中涵蓋的40篇參考文獻進行梳理與講…

uni-app 跨平臺項目的 iOS 上架流程:多工具組合的高效協作方案

跨平臺框架的興起&#xff0c;讓許多團隊選擇 uni-app 來開發移動應用。 一套代碼多端運行&#xff0c;確實大大降低了研發成本&#xff0c;但當項目進入 iOS 上架階段 時&#xff0c;很多團隊依舊面臨挑戰&#xff1a;證書復雜、環境不統一、上傳繁瑣。 本文結合實戰經驗&…

掌握 Linux 文件權限:chown 命令深度解析與實踐

在 Linux 系統的日常運維與開發工作里&#xff0c;文件權限管理是保障系統安全、規范文件訪問的關鍵環節。其中&#xff0c;chown 命令作為修改文件所有者及關聯組的核心工具&#xff0c;對精準把控文件權限起著重要作用。接下來&#xff0c;我們將全面拆解 chown 命令&#xf…

計算機算術7-浮點基礎知識

1. 浮點表示其中b表示基底&#xff0c;e表示指數&#xff0c;s表示尾數&#xff0c;注意在s的表示過程中&#xff0c;有個隱藏1.同時還有個符號位從下面這個圖可以看出&#xff0c;向上溢出和向下溢出的概念&#xff0c;overflow表示的是數的絕對值超過了最大的表示范圍&#x…

設計模式8-命令模式

定義 Command Partern: 將一個請求封裝成一個對象&#xff0c;從而讓你使用不同的請求把客戶端參數化&#xff0c;對請求排隊或者記錄請求日志&#xff0c;可以提供命令的撤銷和恢復功能。&#xff08;核心思想是將“動作”與“執行者”解耦&#xff09; 場景 GUI&#xff1a;…

數據結構(順序表力扣刷題)

1.移除元素 給你一個數組 nums 和一個值 val&#xff0c;你需要 原地 移除所有數值等于 val 的元素。元素的順序可能發生改變。然后返回 nums 中與 val 不同的元素的數量。 假設 nums 中不等于 val 的元素數量為 k&#xff0c;要通過此題&#xff0c;您需要執行以下操作&…

機器學習 - Kaggle項目實踐(6)Dogs vs. Cats Redux: Kernels Edition 貓狗二分類

Dogs vs. Cats Redux: Kernels Edition | Kaggle 任務&#xff1a;給定貓狗圖像數據集 進行二分類。 Cats or Dogs - using CNN with Transfer Learning | Kaggle&#xff08;參考&#xff09; Cats or Dogs | Kaggle &#xff08;我的kaggle&#xff09; 本文介紹了使用Re…