Java Web開發實戰與項目——Spring Boot與Redis實現緩存管理

緩存技術在現代Web開發中至關重要,尤其是在高并發的環境中,緩存能夠有效減少數據庫訪問壓力、提高系統性能。Redis作為最流行的內存數據存儲系統之一,常用于緩存管理。本節將講解如何在Spring Boot項目中集成Redis,實現緩存管理,并深入探討Redis的基礎、緩存失效策略以及如何使用Redis構建分布式緩存。


1. Redis基礎與Spring Data Redis
1.1 Redis簡介

Redis是一個開源的內存數據結構存儲系統,它可以用作數據庫、緩存以及消息隊列系統。Redis支持多種數據結構,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。Redis的特點是高效、持久化支持、發布訂閱機制和簡單的API。

1.2 Spring Data Redis

Spring Data Redis是Spring Data項目的一部分,旨在簡化Redis的使用,它封裝了Jedis和Lettuce等Redis客戶端,并提供了與Spring的其他部分(如Spring Boot、Spring Cache等)無縫集成的功能。通過Spring Data Redis,可以輕松實現Redis的存取操作,支持常見的數據結構操作。

1.3 配置Redis連接

首先,我們需要在Spring Boot項目中配置Redis連接。在application.propertiesapplication.yml文件中進行以下配置:

spring:redis:host: localhostport: 6379password: # 如果有密碼的話可以配置timeout: 3000jedis:pool:max-active: 10max-idle: 5min-idle: 1max-wait: 2000

這里的配置包括Redis的主機地址、端口、連接池配置等。Spring Boot通過spring-boot-starter-data-redis自動裝配了Redis的相關組件。

1.4 RedisTemplate與StringRedisTemplate

Spring Data Redis提供了兩個常用的類:RedisTemplateStringRedisTemplate

  • RedisTemplate: 用于支持所有類型的Redis數據結構。
  • StringRedisTemplate: 繼承自RedisTemplate,專門用于操作字符串類型的數據。

通常情況下,推薦使用StringRedisTemplate處理簡單的字符串緩存,RedisTemplate適合處理復雜的數據類型。

2. 在項目中集成Redis緩存

在Spring Boot中集成Redis緩存十分簡單,Spring Cache提供了對Redis的支持。接下來,我們將實現一個簡單的緩存管理系統,使用Redis作為緩存存儲。

2.1 添加依賴

pom.xml中添加Spring Data Redis和緩存相關的依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.2 開啟緩存支持

在主啟動類中(例如Application.java)開啟Spring緩存支持:

@SpringBootApplication
@EnableCaching  // 開啟緩存支持
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
2.3 使用緩存注解

使用@Cacheable注解實現緩存。當某個方法被調用時,Spring首先會檢查緩存中是否已有數據。如果有,直接返回緩存數據;如果沒有,執行方法并將結果存入緩存。

@Service
public class ProductService {@Cacheable(value = "products", key = "#productId")public Product getProductById(Long productId) {// 模擬數據庫查詢return productRepository.findById(productId).orElseThrow(() -> new RuntimeException("Product not found"));}
}

在此示例中,@Cacheable會根據productId作為緩存的鍵,將返回的Product對象存儲在products緩存中。如果同樣的productId再次被請求,Spring會直接從Redis中讀取數據。

2.4 緩存管理與清除

除了緩存數據,我們還可以使用@CachePut來更新緩存,使用@CacheEvict來清除緩存。

@CachePut(value = "products", key = "#product.id")
public Product updateProduct(Product product) {return productRepository.save(product);
}@CacheEvict(value = "products", key = "#productId")
public void deleteProduct(Long productId) {productRepository.deleteById(productId);
}
  • @CachePut: 在每次方法執行后都更新緩存。
  • @CacheEvict: 清除緩存,當緩存失效時會重新加載數據。

3. 緩存失效策略與分布式緩存

緩存管理不僅僅是將數據存入緩存,還需要考慮緩存的失效策略、過期時間設置,以及如何實現分布式緩存。

3.1 緩存失效策略

Redis支持多種緩存失效策略,常見的有以下幾種:

  • 設置過期時間:使用expire命令設置緩存過期時間。當緩存超過指定時間后,Redis會自動刪除該緩存項。
  • LRU(Least Recently Used)淘汰策略:Redis支持設置最大內存限制,當緩存占用內存達到上限時,Redis會根據LRU算法淘汰最久未使用的數據。
  • 定期刪除:Redis會定期掃描緩存,刪除已經過期的鍵。

在Spring中,可以通過@Cacheablettl(過期時間)來配置緩存失效時間。例如,緩存15分鐘:

@Cacheable(value = "products", key = "#productId", ttl = 900)
public Product getProductById(Long productId) {return productRepository.findById(productId).orElseThrow(() -> new RuntimeException("Product not found"));
}
3.2 分布式緩存設計

在分布式系統中,緩存通常不僅僅部署在單個Redis實例上,而是需要支持多個Redis節點。Spring Boot通過Redis集群、Redis哨兵等方案支持分布式緩存。

  • Redis集群:通過Redis Cluster可以實現數據的水平分片,確保緩存可以跨多個Redis節點分布。
  • Redis哨兵:Redis Sentinel可以實現高可用性和自動故障切換。

為了支持分布式緩存,我們可以使用Redis Cluster或哨兵的配置來確保高可用性。在application.yml中配置Redis集群:

spring:redis:cluster:nodes:- 127.0.0.1:7000- 127.0.0.1:7001- 127.0.0.1:7002password: yourpassword

Spring Boot會自動識別Redis集群配置,連接多個Redis節點,并進行緩存數據的分布式存儲和管理。

3.3 緩存穿透與擊穿解決方案

在實際應用中,緩存穿透和緩存擊穿是兩個常見問題:

  • 緩存穿透:指查詢不存在的數據,直接訪問數據庫而繞過緩存。解決方法是使用布隆過濾器(Bloom Filter)來判斷數據是否存在。
  • 緩存擊穿:指緩存中的數據過期后,多個請求同時訪問該數據,導致大量并發請求直接訪問數據庫。解決方法是使用互斥鎖或@Cacheablesync參數,確保只有一個請求去加載數據。

總結

本文詳細介紹了如何在Spring Boot中集成Redis緩存管理。通過Spring Data Redis,能夠快速地將Redis引入到Spring Boot應用中,實現緩存功能。通過使用@Cacheable@CachePut@CacheEvict等注解,我們能夠方便地管理緩存的增刪改查。

此外,我們還討論了Redis的緩存失效策略以及如何設計分布式緩存系統。對于高并發、大規模數據的應用,Redis提供的各種緩存策略和高可用性解決方案能夠顯著提高系統的性能和穩定性。通過合理設計緩存失效策略和處理緩存穿透、緩存擊穿等問題,我們能夠構建一個高效的緩存管理系統。

關于作者:

15年互聯網開發、帶過10-20人的團隊,多次幫助公司從0到1完成項目開發,在TX等大廠都工作過。當下為退役狀態,寫此篇文章屬個人愛好。本人開發期間收集了很多開發課程等資料,需要可聯系我

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

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

相關文章

C語言學習【1】C語言關于寄存器的封裝

目錄 1.封裝寄存的C語言的語法volatile&#xff1a;unsigned int:*pGpiobOdrvolatile unsigned int * 2.進一步C語言的封裝 在嵌入式中&#xff0c;底層一定是操作寄存器&#xff0c;我有一個理念&#xff0c;凡事一定要想清楚&#xff0c;把任何知識點融入自己的理解之中&…

#滲透測試#批量漏洞挖掘#暢捷通T+遠程命令執行漏洞

免責聲明 本教程僅為合法的教學目的而準備,嚴禁用于任何形式的違法犯罪活動及其他商業行為,在使用本教程前,您應確保該行為符合當地的法律法規,繼續閱讀即表示您需自行承擔所有操作的后果,如有異議,請立即停止本文章讀。 目錄 一、漏洞概況 二、攻擊特征 三、應急處置…

ollama 學習筆記

1. 參考博客&#xff1a;1. Ollama完整教程&#xff1a;本地LLM管理、WebUI對話、Python/Java客戶端API應用&#xff1a;https://blog.csdn.net/python122_/article/details/1409457202. https://gitee.com/ai-big-model/ollama/tree/main --》REST APIollama 離線安裝包 ollam…

ARM Linux平臺下 OpenCV Camera 實驗

一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的圖像傳感器&#xff0c;支持以下功能&#xff1a; 最高分辨率&#xff1a;200 萬像素&#xff08;1600x1200&#xff09;。 輸出格式&#xff1a;JPEG、YUV、RGB。 內置圖像處理功能&#xff1a;自動曝…

vue2.x中父組件通過props向子組件傳遞數據詳細解讀

1. 父組件向子組件傳遞數據的步驟 在子組件中定義 props&#xff1a; 子組件通過 props 選項聲明它期望接收的數據。props 可以是數組形式&#xff08;簡單聲明&#xff09;或對象形式&#xff08;支持類型檢查和默認值&#xff09;。 在父組件中使用子組件時綁定 props&#x…

【Gin】2:快速上手Gin框架(模版、cookie、session)

本文目錄 一、模版渲染二、自定義模版函數三、cookie四、Session五、cookie、session區別六、會話攻擊 一、模版渲染 在 Gin 框架中&#xff0c;模板主要用于動態生成 HTML 頁面&#xff0c;結合 Go 語言的模板引擎功能&#xff0c;實現數據與視圖的分離。 模板渲染是一種動態…

【AI繪畫】大衛? 霍克尼風格——自然的魔法(一丹一世界)

大衛? 霍克尼&#xff0c;很喜歡這個老頭&#xff0c;“藝術是一場戰斗”。老先生零九年有了iphone&#xff0c;開始用iphone畫畫&#xff0c;一零年開始用ipad畫畫&#xff0c;用指頭劃拉&#xff0c;據說五分鐘就能畫一幅&#xff0c;每天早上隨手畫幾幅送給身邊的朋友。很c…

解碼 NLP:從萌芽到蓬勃的技術蛻變之旅

內容概況&#xff1a; 主要講述NLP專欄的內容和NLP的發展及其在現代生活中的廣泛應用。專欄強調實踐為主、理論為輔的學習方法&#xff0c;并通過多個生活場景展示了NLP技術的實際應用&#xff0c;如對話機器人、搜索引擎、翻譯軟件、電商推薦和智能客服等。 這邊我就不多做自我…

解決DeepSeek服務器繁忙問題的實用指南

目錄 簡述 1. 關于服務器繁忙 1.1 服務器負載與資源限制 1.2 會話管理與連接機制 1.3 客戶端配置與網絡問題 2. 關于DeepSeek服務的備用選項 2.1 納米AI搜索 2.2 硅基流動 2.3 秘塔AI搜索 2.4 字節跳動火山引擎 2.5 百度云千帆 2.6 英偉達NIM 2.7 Groq 2.8 Firew…

前端(AJAX)學習筆記(CLASS 2):圖書管理案例以及圖片上傳

* BootStrap彈框 功能&#xff1a;不離開當前頁面&#xff0c;顯示單獨內容&#xff0c;供用戶操作 步驟&#xff1a; 1、引入bootstrap.css和bootstrap.js 2、準備彈框標簽&#xff0c;確認結構 3、通過自定義屬性&#xff0c;控制彈框的顯示和隱藏 其中的bootstrap.css…

數據結構:雙鏈表list

list 是 C 標準庫中的雙向鏈表容器。 list初始化示例&#xff1a; #include <list>int n 7;std::list<int> lst; // 初始化一個空的雙向鏈表 lststd::list<int> lst(n); // 初始化一個大小為 n 的鏈表 lst&#xff0c;鏈表中的值默認都為 0std::list<i…

AI Agent Service Toolkit:一站式大模型智能體開發套件

項目簡介 該工具包基于LangGraph、FastAPI和Streamlit構建,提供了構建和運行大模型Agent的最小原子能力,包含LangGraph代理、FastAPI服務、用于與服務交互的客戶端以及一個使用客戶端提供聊天界面的Streamlit應用。用戶可以利用該工具包提供的模板快速搭建基于LangGraph框架…

論文概覽 |《Urban Analytics and City Science》2023.10 Vol.50 Issue.8

本次給大家整理的是《Environment and Planning B: Urban Analytics and City Science》雜志2023年10月第50卷第8期的論文的題目和摘要&#xff0c;一共包括21篇SCI論文&#xff01; 論文1 Advances in geospatial approaches to transport networks and sustainable mobility …

大語言模型推理能力從何而來?

前言 DeepSeek R1采用強化學習進行后訓練&#xff0c;通過獎勵機制和規則引導模型生成結構化思維鏈&#xff08;CoT&#xff09;&#xff0c;從而顯著提升了推理能力。這一創新方法使得DeepSeek R1能夠在無需大量監督數據的情況下&#xff0c;通過自我進化發展出強大的推理能力…

用 WOW.js 和 animate.css 實現動畫效果

用 wow.js 就可以實現動畫效果&#xff0c;但由于里面的動畫樣式太少&#xff0c;一般還會引入 animated.css 第一步&#xff1a;下載 選擇合適的包管理器下載對應的內容 pnpm i wow.js animated.css --save 第二步&#xff1a;引入 在main.js中加入&#xff1a; import …

設計模式教程:解釋器模式(Interpreter Pattern)

1. 什么是解釋器模式&#xff1f; 解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種行為型設計模式&#xff0c;通常用于處理語言&#xff08;例如數學表達式、SQL查詢等&#xff09;中的語法和解釋。該模式定義了一個文法&#xff0c;并通過解釋器類來解釋文法中…

STM32MP157A單片機移植Linux驅動深入版

需求整理 在Linux設備樹中新增leds節點&#xff0c;其有3個gpio屬性&#xff0c;分別表示PE10對應led1&#xff0c;PF10對應led2&#xff0c;PE8對應led3&#xff0c;設備樹鍵值對如下&#xff1a; leds { led1-gpio <&gpioe 10 0>; led2-gpio &l…

本地DeepSeek模型GGUF文件轉換為PyTorch格式

接前文,我們在本地Windows系統上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已經量化的版本,我們除了對其進行微調之外,無法對其訓練,那么還有沒有其他辦法對本地的GGUF部署的DeepSeek模型進行訓練呢?今天我們就反其道而行之…

http代理IP怎么實現?如何解決代理IP訪問不了問題?

HTTP代理是一種網絡服務&#xff0c;它充當客戶端和目標服務器之間的中介。當客戶端發送請求時&#xff0c;請求首先發送到代理服務器&#xff0c;然后由代理服務器轉發到目標服務器。同樣&#xff0c;目標服務器的響應也會先發送到代理服務器&#xff0c;再由代理服務器返回給…

人工智能之數學基礎:施密特正交化

本文重點 在前面的課程中,我們學習了線性空間的基,其中有一個標準正交基的概念,假設現在有一個線性向量空間,然后已經確定了該線性空間的一組基,那么如何將其轉變為標準正交基。本文將學習如何通過施密特正交化完成這個任務。 施密特正交化 施密特正交化(Schmidt Orth…