springboot redis 緩存入門與實戰

Spring Boot3 Redis 項目地址

https://gitee.com/supervol/loong-springboot-study

(記得給個start,感謝)

Redis 介紹

????????Redis 是一款高性能的?內存數據庫(支持持久化),兼具緩存、NoSQL 存儲、分布式鎖等核心能力;Spring Boot 3 作為主流的 Java 開發框架,通過?spring-boot-starter-data-redis?starter 簡化了 Redis 的整合流程,降低了開發門檻。

Redis 核心

????????開源內存數據庫,支持?String、Hash、List、Set、ZSet?等數據結構,主打高性能(QPS 達 10W+)、低延遲,常用于緩存、分布式鎖、會話存儲等場景。Spring Boot 3 為 Redis 提供了兩個核心操作類:RedisTemplate?和?StringRedisTemplate,兩者定位不同,需根據場景選擇。

1. StringRedisTemplate

  • 定位:專門處理?String 類型?的 Redis 操作(鍵和值均為 String)。
  • 默認配置:使用?StringRedisSerializer?序列化鍵和值,序列化后的數據在 Redis 中?可讀性強(無亂碼)。
  • 適用場景:存儲簡單字符串(如驗證碼、會話 ID、計數器等)。

2. RedisTemplate

  • 定位:通用 Redis 操作類,支持?任意類型?的鍵和值(通過泛型?RedisTemplate<K, V>?約束)。
  • 默認配置問題:默認使用?JdkSerializationRedisSerializer?序列化,會導致 Redis 中存儲的是?二進制數據(可讀性差,且需實體類實現?Serializable?接口),不推薦直接使用默認配置
  • 優化方案:自定義?RedisTemplate,使用?Jackson2JsonRedisSerializer?序列化(支持 JSON 格式,可讀性強,無需實現?Serializable)。

Redis 示例

1. 前置條件

  • JDK 17+(推薦 JDK 17 或 21)
  • 構建工具:Maven 3.6+
  • 開發工具:IntelliJ IDEA
  • Redis 環境:?Redis 6.x+? ? ? ?

2. 代碼位置

????????請參考項目地址中 springboot-cache/springboot-redis 模塊代碼。

Redis 高級

????????Spring Boot 3 不僅支持 Redis 基礎操作,還能便捷整合其高級特性(如緩存抽象、分布式鎖、發布訂閱)。基于 Redis 的緩存抽象,Spring 提供了?緩存注解(如?@Cacheable),結合 Redis 可快速實現緩存功能,無需手動調用?RedisTemplate

步驟 1:啟用緩存

????????在啟動類上添加?@EnableCaching?注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching // 啟用 Spring 緩存抽象
public class RedisDemoApplication {public static void main(String[] args) {SpringApplication.run(RedisDemoApplication.class, args);}
}

步驟 2:使用緩存注解

????????常用注解說明及示例:

注解作用
@Cacheable方法執行前先查緩存,有則返回緩存值;無則執行方法,將結果存入緩存。
@CachePut執行方法后,將結果存入緩存(覆蓋舊值,常用于更新操作)。
@CacheEvict刪除緩存(常用于刪除操作,支持批量刪除)。
@Caching組合多個緩存操作(如同時?@Cacheable?和?@CacheEvict)。

示例代碼:

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class UserService {/*** 查詢用戶:優先查緩存(key 為 "user:userId"),無則查數據庫并緩存(1 小時過期)*/@Cacheable(value = "user", // 緩存名稱(對應 Redis 中的 key 前綴:user::xxx)key = "#userId", // 緩存 key 的后綴(SpEL 表達式,#userId 為方法參數)unless = "#result == null", // 結果為 null 時不緩存timeout = 3600 // 緩存過期時間(秒))public User getUserById(Long userId) {// 模擬數據庫查詢(實際項目中替換為 MyBatis/JPA 調用)System.out.println("查詢數據庫:userId = " + userId);return new User(userId, "張三", 25, "zhangsan@xxx.com");}/*** 更新用戶:執行方法后更新緩存(覆蓋舊值)*/@CachePut(value = "user",key = "#user.id", // 用用戶 ID 作為 keyunless = "#user == null")public User updateUser(User user) {// 模擬數據庫更新System.out.println("更新數據庫:user = " + user);return user;}/*** 刪除用戶:執行方法后刪除緩存*/@CacheEvict(value = "user",key = "#userId")public void deleteUser(Long userId) {// 模擬數據庫刪除System.out.println("刪除數據庫:userId = " + userId);}
}

Redis 指南

1. 序列化方式選擇

序列化器優點缺點推薦度
Jackson2JsonRedisSerializer可讀性強、支持復雜對象、無需實現 Serializable需配置類型信息(避免反序列化丟失類型)★★★★★
StringRedisSerializer可讀性強、輕量僅支持 String 類型★★★★☆
JdkSerializationRedisSerializer無需額外配置、支持所有實現 Serializable 的類可讀性差(二進制)、需實現 Serializable★★☆☆☆

????????結論:優先使用?Jackson2JsonRedisSerializer(自定義?RedisTemplate)。

2. 連接池配置優化

  • max-active:根據并發量調整(如 16-64,避免過大導致 Redis 壓力)。
  • max-idle:建議與?max-active?一致(避免頻繁創建連接)。
  • max-wait:設置為 1-3 秒(避免無限等待,快速失敗)。
  • timeout:設置為 1-3 秒(避免網絡波動導致的長時間阻塞)。

3. 緩存問題解決方案

問題原因解決方案
緩存穿透請求不存在的 key,穿透緩存直擊數據庫1. 緩存空值(短期過期);2. 使用布隆過濾器
緩存擊穿熱點 key 過期,大量請求直擊數據庫1. 互斥鎖(如 Redisson 鎖);2. 熱點 key 永不過期
緩存雪崩大量 key 同時過期,數據庫壓力驟增1. 過期時間加隨機值(分散過期);2. 集群部署 Redis

4. 數據一致性保障

????????緩存與數據庫同步的核心原則:先更新數據庫,后操作緩存(避免臟數據)。

  • 更新操作:更新數據庫 → 刪除緩存(推薦,避免更新緩存失敗導致臟數據)。
  • 刪除操作:刪除數據庫 → 刪除緩存。

總結? ? ? ??

????????Spring Boot 3 整合 Redis 簡化了開發流程,通過?RedisTemplate/StringRedisTemplate?可快速操作 Redis 基礎數據結構,結合 Spring 緩存抽象、Redisson 分布式鎖等高級特性,能滿足企業級應用的核心需求。實際開發中需注意序列化配置、連接池優化、緩存一致性等問題,確保系統高性能、高可用。Redis 的場景覆蓋?緩存、分布式協調、計數、消息、排序?等多個領域,核心是利用其?高性能、多結構、原子性?的特性解決傳統數據庫或單體應用的痛點。實際使用時需根據業務需求選擇合適的數據結構和命令,同時注意內存管理、持久化策略和高可用部署(如主從、集群)。

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

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

相關文章

Redis緩存三大經典問題:雪崩、穿透、擊穿詳解

在高并發系統中&#xff0c;Redis作為高性能的內存緩存數據庫&#xff0c;緩存可能會引發一系列嚴重問題——緩存雪崩、緩存穿透、緩存擊穿。一、緩存雪崩&#xff08;Cache Avalanche&#xff09;1. 什么是緩存雪崩&#xff1f;緩存雪崩是指大量緩存數據在同一時間集中失效&am…

后端Web實戰-刪除修改

目錄 1.刪除員工 1.1.1 需求 1.1.2 接口文檔 1.1.3 思路分析 1.1.4 功能開發 1.1.4.1 Controller接收參數 1.1.4.2 Service 1.1.4.3 Mapper 1.1.5 功能測試 1.1.6 前后端聯調 2.修改員工 2.1 查詢回顯 2.1.1 接口文檔 2.1.2 實現思路 2.1.3 代碼實現 2.1.4 方式…

VNC連接服務器實現遠程桌面-針對官方給的鏈接已經失效問題

按照官方給的鏈接在安裝包的時候找不到鏈接&#xff0c;原鏈接可能已經失效新鏈接# 下載 libjpeg-turbo 官方 debwget --no-proxy "https://sourceforge.net/projects/libjpeg-turbo/files/2.0.90%20(2.1%20beta1)/libjpeg-turbo-official_2.0.90_amd64.deb/download"…

Docker在Windows與Linux系統安裝的一體化教學設計

Docker跨平臺安裝實訓課程設計 一、課程定位 本實訓課程面向計算機應用技術、云計算技術與應用等專業學生&#xff0c;通過對比學習Docker在Windows和Linux兩大主流操作系統上的安裝與配置方法&#xff0c;幫助學生掌握容器化技術的基礎環境搭建能力&#xff0c;為后續的容器管…

c++多線程(1)------創建和管理線程td::thread

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 std::thread 是 C11 標準庫中用于創建和管理線程的核心類&#xff0c;定義在 頭文件中。它使得多線程編程變得簡單、類型安全且跨平臺。 一、std::thread 簡介 std::thread 是一個類…

Flutter環境搭建全攻略之-windows環境搭建

一&#xff0c;Flutter 官網&#xff1a;https://flutter.dev Flutter Packages官網&#xff1a;https://pub.dev 二&#xff0c;Windows 上面搭建Flutter Android運行環境 對應軟件可以聯系客服&#xff0c;或者網盤里面下載 1&#xff0c;Flutter Android環境搭建&#xff1a…

《Docker 零基礎入門到實戰:容器化部署如此簡單,運維效率直接拉滿》

相信你對封面圖上的「Docker 鯨魚」圖標并不陌生 —— 它正是解決「開發環境能跑&#xff0c;生產環境崩了」的容器化神器&#xff01;Docker 通過打包應用與依賴到輕量容器&#xff0c;實現了「一次構建&#xff0c;到處運行」&#xff0c;徹底消除環境不一致的痛點。本文從 D…

Spring Security 深度學習(六): RESTful API 安全與 JWT

目錄 1. 引言&#xff1a;無狀態認證的崛起2. JWT (JSON Web Token) 核心概念2.1 什么是JWT&#xff1f;2.2 JWT的組成&#xff1a;Header, Payload, Signature2.3 JWT的工作原理2.4 JWT的優缺點與適用場景 3. Spring Security中的JWT集成策略3.1 禁用Session管理與CSRF防護3.2…

無名信號量

include <myhead.h> oid *task( void *file_size)int file_size1*(int*)file_size;//打開源文件int fdopen("./hello",O_RDONLY);if(fd-1){perror("open error\n");return NULL;}//打開目標文件int fd1open("./world",O_WRONLY);if(fd1-1)…

免費CRM系統與Excel客戶管理的區別

很多中小企業在客戶管理初期&#xff0c;會選擇使用Excel表格進行客戶數據的整理與維護。但隨著業務規模擴大&#xff0c;客戶信息日益復雜&#xff0c;Excel逐漸暴露出諸多局限性。此時&#xff0c;免費CRM系統應運而生&#xff0c;成為企業客戶管理升級的重要選擇。本文將深入…

linux Nginx服務配置介紹,和配置流程

1、Nginx 配置介紹認識Nginx服務的主配置文件 nginx.confnginx的配置文件一般在 /usr/local/nginx/conf/下&#xff0c;然后直接vim nginx.com 即可編輯1.1 全局配置介紹全局配置位于主配置文件最頂部&#xff0c;作用于整個Nginx服務進程&#xff0c;影響服務的資源分配、運行…

文字識別接口-文字識別技術-ocr api

文字識別接口&#xff0c;顧名思義&#xff0c;就是一種將圖像文字或手寫文字轉換為可編輯文本的技術。文字識別接口&#xff0c;基于深度學習算法與自主ocr核心實現多種場景字符的高精度識別與結構化信息提取&#xff0c;現已被廣泛應用于銀行、醫療、財會、教育等多個領域。隨…

DeepSeek R1大模型微調實戰-llama-factory的模型下載與訓練

文章目錄概要1.下載模型2.llama factory 訓練模型2.1 模型微調2.2 模型評估2.3 模型對話2.4 導出模型3.硬件選擇概要 LLaMA Factory 是一個簡單易用且高效的大型語言模型訓練與微調平臺。通過它&#xff0c;用戶可以在無需編寫任何代碼的前提下&#xff0c;在本地完成上百種預…

C++ map和set

C參考文獻&#xff1a;cplusplus.com - The C Resources Network 目錄 一、序列式容器和關聯式容器 二、set系列 &#xff08;1&#xff09;set類的介紹 &#xff08;2&#xff09;set的構造和迭代器 &#xff08;3&#xff09;set的接口 1.insert?編輯 2.find和erase 3…

頭一次見問這么多kafka的問題

分享一篇粉絲朋友整理的面經&#xff0c;第一次遇見問那么多kafka的問題&#xff0c;看看他是怎么回答的。 先來看看 職位描述&#xff1a; 崗位職責&#xff1a; 負責基于 Go 的后端服務的設計、開發和維護&#xff1b;參與系統架構設計&#xff0c;確保系統的高可用性、高性能…

自底向上了解CPU的運算

文章目錄 引言 CPU如何實現邏輯運算 NMOS和PMOS 基于MOS管組合下的邏輯門運算 邏輯運算下運算的實現 ALU的誕生 CPU的誕生 關于二進制運算的研究 十進制轉二進制基礎換算 為什么負數要使用補碼進行表示 為什么反碼就能解決正負數相加問題,我們還需要用補碼來表示負數呢? 小數…

apache poi與Office Open XML關系

以下內容來自AI https://ecma-international.org/publications-and-standards/standards/ecma-376/ 官方規范 https://poi.apache.org/components/oxml4j/index.html java中針對Office Open XML的實現 Apache poi中各個組件 https://poi.apache.org/components/index.html …

S32K328上芯片內部RTC的使用和喚醒配置

1&#xff1a;RTC介紹 1.1 RTC基礎功能介紹 參考《S32K3xx Reference Manual》&#xff0c;S32K328芯片內部自帶RTC功能&#xff0c;并且支持從低功耗狀態下喚醒設備&#xff1b;1.2 RTC電源介紹 由以下三張圖可知 1&#xff1a;RTC由V11供電&#xff0c;V11依賴外部V15供電&am…

【Python】數據可視化之分類圖

目錄 條形圖 箱形圖 散點圖 分簇散點圖 小提琴 分簇小提琴 條形圖 條形圖是一種直觀的圖表形式&#xff0c;它通過不同長度的矩形條&#xff08;即“條形”&#xff09;來展示數值變量的中心趨勢估計值&#xff0c;其中每個矩形的高度直接對應于該組數據的某個中心量度&…

RabbitMQ模型詳解與常見問題

項目demo地址&#xff1a;https://github.com/tian-qingzhao/rabbitmq-demo 一、RabbitMQ組件概念 1.1 Server&#xff1a;接收客戶端的連接&#xff0c;實現AMQP實體服務。 1.2 Connection&#xff1a;連接 應用程序與Server的網絡連接&#xff0c;TCP連接。 1.3 Channel&…