[Java實戰]Spring Boot 整合 Redis(十八)

[Java實戰]Spring Boot 整合 Redis(十八)

在現代的分布式應用開發中,Redis 作為一種高性能的鍵值存儲數據庫,被廣泛用于緩存、消息隊列、排行榜等多種場景。Spring Boot 提供了強大的支持,使得整合 Redis 變得非常簡單。本文將詳細介紹如何在 Spring Boot 項目中整合 Redis,從基礎配置到高級用法,幫助你快速上手并深入掌握。

一、Redis 簡介

Redis(Remote Dictionary Server,遠程字典服務)是一個開源的鍵值存儲數據庫,通常用作數據庫、緩存或消息代理。它支持多種數據結構,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。

Redis 的主要特點

  • 高性能:每秒可處理數十萬次讀寫操作。
  • 支持豐富的數據類型:不僅支持簡單的 key-value 類型,還支持 list、set、zset(sorted set)等復雜數據類型。
  • 原子操作:所有操作都是原子性的,保證了數據的一致性。
  • 持久化:支持 RDB(快照)和 AOF(追加文件)兩種持久化方式。

二、Spring Boot 整合 Redis

1. 添加依賴

在 Spring Boot 項目中,整合 Redis 非常簡單。首先,需要在 pom.xml 文件中添加 Redis 相關的依賴。

<dependencies><!-- Spring Boot Starter Data Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
</dependencies>

2. 配置 Redis

application.ymlapplication.properties 文件中配置 Redis 的連接信息。

application.yml
spring:redis:host: localhostport: 6379password: your_password # 如果有密碼database: 0 # 數據庫編號(默認為 0)timeout: 5000ms # 連接超時時間
application.properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_password # 如果有密碼
spring.redis.database=0 # 數據庫編號(默認為 0)
spring.redis.timeout=5000ms # 連接超時時間

3. 配置 RedisTemplate

RedisTemplate 是 Spring 提供的用于操作 Redis 的模板類,它封裝了底層的 Jedis 或 Lettuce 客戶端,提供了豐富的 API。

配置 RedisTemplate
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);// 設置序列化器Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);template.setDefaultSerializer(serializer);return template;}
}

4. 使用 RedisTemplate

存儲和獲取數據
@Service
public class RedisService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void set(String key, Object value) {redisTemplate.opsForValue().set(key, value);}public Object get(String key) {return redisTemplate.opsForValue().get(key);}
}
示例:緩存用戶信息
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate RedisService redisService;@PostMapping("/saveUser")public void saveUserInfo(User User){User u =  new User();u.setId("3");u.setAge(25);u.setEmail("alice@example.com");u.setName("Alice");userService.saveUserToRedis(u);}
}

在這里插入圖片描述
在這里插入圖片描述

三、高級用法

1. Redis 消息訂閱與發布

Redis 支持發布/訂閱模式,可以用于實現簡單的消息隊列。

配置消息監聽器
@Component
public class RedisMessageListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String messageStr = new String(message.getBody());System.out.println("Received message: " + messageStr);}
}
配置訂閱
@Configuration
public class RedisMessageConfig {@Beanpublic RedisMessageListenerAdapter messageListener(RedisMessageListener listener) {return new RedisMessageListenerAdapter(listener);}@Beanpublic StringRedisTemplate template(RedisConnectionFactory connectionFactory) {return new StringRedisTemplate(connectionFactory);}@Beanpublic RedisPubSubListener redisPubSubListener() {return new RedisPubSubListener();}@Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,RedisMessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.addMessageListener(listenerAdapter, new PatternTopic("chat"));return container;}
}
發布消息
@Service
public class RedisPubSubService {@Autowiredprivate StringRedisTemplate template;public void sendMessage(String channel, String message) {template.convertAndSend(channel, message);}
}

2. Redis 分布式鎖

在分布式系統中,分布式鎖是一個常見的需求。Redis 提供了基于 SETNX 命令的鎖機制。

實現分布式鎖
@Service
public class RedisLockService {@Autowiredprivate StringRedisTemplate template;public boolean tryLock(String key, String value, long expireTime) {Boolean result = template.opsForValue().setIfAbsent(key, value, expireTime, TimeUnit.MILLISECONDS);return result != null && result;}public void releaseLock(String key, String value) {String currentValue = template.opsForValue().get(key);if (value.equals(currentValue)) {template.delete(key);}}
}
使用分布式鎖
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate RedisLockService redisLockService;@PostMapping("/create")public ResponseEntity<?> createOrder(@RequestBody Order order) {String lockKey = "order:lock";String lockValue = UUID.randomUUID().toString();if (redisLockService.tryLock(lockKey, lockValue, 30000)) {try {// 處理訂單邏輯orderService.createOrder(order);} finally {redisLockService.releaseLock(lockKey, lockValue);}} else {return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("Too many requests");}return ResponseEntity.ok("Order created successfully");}
}

四、常見問題與解決方案

1. Redis 連接超時

原因:Redis 服務器響應慢或網絡問題。

解決方案

  • 增加連接超時時間:
    spring:redis:timeout: 10000ms
    
  • 檢查 Redis 服務器性能,優化配置。

2. 序列化問題

原因:默認的序列化方式可能導致存儲的數據難以理解。

解決方案

  • 使用自定義的序列化器,如 Jackson2JsonRedisSerializer
    Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
    template.setDefaultSerializer(serializer);
    

3. 數據丟失

原因:Redis 默認不開啟持久化。

解決方案

  • 開啟 RDB 或 AOF 持久化:
    appendonly yes
    save 900 1
    save 300 10
    save 60 10000
    

五、總結

本文詳細介紹了 Spring Boot 整合 Redis 的過程,從基礎配置到高級用法,包括消息訂閱與發布、分布式鎖等。通過合理使用 Redis,可以顯著提升應用的性能和擴展性。希望本文能幫助你更好地理解和使用 Spring Boot 整合 Redis。

如果你在使用過程中遇到任何問題,歡迎在評論區留言交流。感謝你的閱讀,希望這篇文章對你有所幫助!

OF 持久化:

appendonly yes
save 900 1
save 300 10
save 60 10000

五、總結

本文詳細介紹了 Spring Boot 整合 Redis 的過程,從基礎配置到高級用法,包括消息訂閱與發布、分布式鎖等。通過合理使用 Redis,可以顯著提升應用的性能和擴展性。希望本文能幫助你更好地理解和使用 Spring Boot 整合 Redis。

如果你在使用過程中遇到任何問題,歡迎在評論區留言交流。感謝你的閱讀,希望這篇文章對你有所幫助!

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

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

相關文章

【氮化鎵】GaN在不同電子能量損失的SHI輻射下的損傷

該文的主要發現和結論如下: GaN的再結晶特性 :GaN在離子撞擊區域具有較高的再結晶傾向,這導致其形成永久損傷的閾值較高。在所有研究的電子能量損失 regime 下,GaN都表現出這種傾向,但在電子能量損失增加時,其效率會降低,尤其是在材料發生解離并形成N?氣泡時。 能量損失…

R語言實戰第5章(1)

第一部分&#xff1a;數學、統計和字符處理函數 數學和統計函數&#xff1a;R提供了豐富的數學和統計函數&#xff0c;用于執行各種計算和分析。這些函數可以幫助用戶快速完成復雜的數學運算、統計分析等任務&#xff0c;例如計算均值、方差、相關系數、進行假設檢驗等。字符處…

k8s術語之Horizontal Pod Autoscaling

應用的資源使用率通常都有高峰和低谷的時候&#xff0c;如何削峰填谷&#xff0c;提高整體的整體資源利用率&#xff0c;讓service中的Pod個數自動調整呢&#xff1f;Horizontal Pod Autoscaling:使pod水平自動縮放。這個Object也是最能體現kubernetes之于傳統運維價值的地方&a…

Linux復習筆記(三) 網絡服務配置(web)

遇到的問題&#xff0c;都有解決方案&#xff0c;希望我的博客能為你提供一點幫助。 二、網絡服務配置 2.3 web服務配置 2.3.1通信基礎&#xff1a;HTTP協議與C/S架構&#xff08;了解&#xff09; ??HTTP協議的核心作用?? Web服務基于HTTP/HTTPS協議實現客戶端&#xff…

9.1.領域驅動設計

目錄 一、領域驅動設計核心哲學 戰略設計與戰術設計的分野 ? 戰略設計&#xff1a;限界上下文&#xff08;Bounded Context&#xff09;與上下文映射&#xff08;Context Mapping&#xff09; ? 戰術設計&#xff1a;實體、值對象、聚合根、領域服務的構建原則 統一語言&am…

CSS Layer 詳解

CSS Layer 詳解 前言 最近在整理CSS知識體系時&#xff0c;發現Layer這個特性特別有意思。它就像是給樣式規則提供了一個專屬的「VIP通道」&#xff0c;讓我們能更優雅地解決樣式沖突問題。今天我就用最通俗的語言&#xff0c;帶大家全面了解這個CSS新特性。 什么是CSS Laye…

【Dv3Admin】工具視圖配置文件解析

在開發后臺管理系統時,處理復雜的 CRUD 操作是常見的需求。Django Rest Framework(DRF)通過 ModelViewSet 提供了基礎的增刪改查功能,但在實際應用中,往往需要擴展更多的功能,如批量操作、權限控制、查詢優化等。dvadmin/utils/viewset.py 模塊通過繼承并擴展 ModelViewS…

?云原生CAE軟件

?云原生CAE軟件?是一種在設計和實現時就充分考慮了云環境特點的軟件&#xff0c;能夠充分利用云資源&#xff0c;實現高效、可擴展和靈活的仿真分析。 定義和特點 云原生CAE軟件是一種在云端構建和運行的CAE&#xff08;Computer Aided Engineering&#xff0c;計算機輔助工…

若依定制pdf生成實戰

一、介紹 使用 Java Apache POI 將文字渲染到 Word 模板是一種常見的文檔自動化技術&#xff0c;廣泛應用于批量生成或定制 Word 文檔的場景。使用aspose可以將word轉成pdf從而達到定制化pdf的目的。 參考文檔&#xff1a;java實現Word轉Pdf&#xff08;Windows、Linux通用&a…

Redis再次開源!reids8.0.0一鍵安裝腳本分享

準備工作 1. 下載 Redis 8 安裝包 # Redis 8.0.0 示例&#xff08;請替換為實際版本&#xff09; http://download.redis.io/releases/redis-8.0.0.tar.gz一、腳本內容&#xff1a; #!/usr/bin/python # -*- coding: UTF-8 -*-import os import time import shutil import s…

stm32之BKP備份寄存器和RTC時鐘

目錄 1.時間戳1.1 Unix時間戳1.2 UTC/GMT1.3 時間戳轉換**1.** time_t time(time_t*)**2.** struct tm* gmtime(const time_t*)**3.** struct tm* localtime(const time_t*)**4.** time_t mktime(struct tm*)**5.** char* ctime(const time_t*)**6.** char* asctime(const stru…

Android學習總結之算法篇八(二叉樹和數組)

路徑總和 import java.util.ArrayList; import java.util.List;// 定義二叉樹節點類 class TreeNode {int val;TreeNode left;TreeNode right;// 構造函數&#xff0c;用于初始化節點值TreeNode(int x) {val x;} }public class PathSumProblems {// 路徑總和 I&#xff1a;判…

Scala和Spark的介紹

Scala 1. Slaca的發展過程 由洛桑聯邦理工學院的馬丁 奧德斯在 2001 年基于 Funnel 的工作開始設計&#xff0c;設計初衷是想集成面向對象編程和函數式編程的各種特性。 Scala 是一種純粹的面向對象的語言&#xff0c;每個值都是對象。 Scala 也是一種函數式語言&#xff0…

配置Hadoop集群環境-使用腳本命令實現集群文件同步

在 Hadoop 集群環境中&#xff0c;確保各節點配置文件一致至關重要。以下是使用 rsync 結合 SSH 實現集群文件同步的腳本方案&#xff0c;支持批量同步文件到所有節點&#xff1a; 1. 前提條件 所有節點已配置 SSH 免密登錄主節點&#xff08;NameNode&#xff09;能通過主機…

Redis能保證數據不丟失嗎之RDB

有了AOF為什么還需要RDB? 上一篇我們介紹了Redis AOF持久化策略。Redis能保證數據不丟失嗎之AOF AOF雖然能實現持久化,但由于AOF恢復數據的時候是一條一條命令重新執行的,但數據量大的時候,Redis數據恢復的時間就會很久,這會導致Redis在重啟的時候,有一大段時間的不可用…

AI浪潮下的藝術突圍戰:對話《名人百科數據庫》執行主編劉鑫煒

當AI生成的畫作在國際賽事中摘冠&#xff0c;當算法推薦主導藝術傳播路徑&#xff0c;技術革命正以前所未有的速度重塑藝術生態。我們獨家專訪深耕藝術推廣領域的劉鑫煒主編&#xff0c;探討當代藝術家在智能時代的生存法則。 圖為《名人百科數據庫》執行主編劉鑫煒 技術重構創…

Python 實現失敗重試功能的幾種方法

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 方法 1:手動 `while` 循環 + 異常捕獲方法 2:使用 `tenacity` 庫(推薦)方法 3:使用 `retrying` 庫(舊版,已停止維護)方法 4:`requests` 自帶重試(適用于 HTTP 請求)方法 5:自定義裝飾器(靈活控制)方法…

2025年滲透測試面試題總結-滲透測試紅隊面試七(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 滲透測試紅隊面試七 一百八十一、Shiro漏洞類型&#xff0c;721原理&#xff0c;721利用要注意什么&am…

Unity動畫系統使用整理 --- Playable

??Playable API?? 是一個強大的工具&#xff0c;用于更靈活地控制動畫、音頻、腳本等時間軸內容的播放和混合。它提供了比傳統 Animator 更底層、更可控的方式管理時間軸行為&#xff0c;尤其適合復雜動畫邏輯或動態內容組合的場景。 優點&#xff1a; 1.Playables API 支…

基于STM32、HAL庫的BMP390L氣壓傳感器 驅動程序設計

一、簡介: BMP390L 是 Bosch Sensortec 生產的一款高精度氣壓傳感器,專為需要精確測量氣壓和海拔高度的應用場景設計。BMP390L 具有更低的功耗、更高的精度和更快的響應速度。 二、硬件接口: BMP390L 引腳STM32L4XX 引腳說明VDD3.3V電源GNDGND地SCLPB6 (I2C1 SCL)I2C 時鐘線…