Spring Data Redis 從入門到精通:原理與實戰指南

一、Redis 基礎概念
Redis(Remote Dictionary Server)是開源的內存鍵值對數據庫,以高性能著稱。它支持多種數據結構(String、Hash、List、Set、ZSet),并提供持久化機制(RDB、AOF)。
核心特點:
內存存儲,讀寫速度極快(單線程處理命令,QPS 可達 10w+)
支持數據持久化,避免重啟數據丟失
提供豐富的數據結構操作
支持主從復制、哨兵模式和集群部署
單線程模型,避免上下文切換開銷


典型應用場景:
緩存(減輕數據庫壓力)
計數器 / 限速器(如點贊數、限流)
消息隊列(基于 List 或 Pub/Sub)
會話存儲(分布式系統共享 Session)
排行榜(ZSet 有序集合)


二、Spring Data Redis 入門
Spring Data Redis 是 Spring 家族的一部分,提供了簡化 Redis 操作的抽象層。
核心組件:
RedisTemplate:操作 Redis 的核心類
StringRedisTemplate:RedisTemplate 的子類,專門處理字符串
RedisConnectionFactory:連接工廠,管理 Redis 連接
RedisSerializer:序列化器,處理數據的序列化與反序列化
快速上手步驟:
添加依賴(Maven)
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置連接信息(application.properties)
properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=yourpassword
使用 RedisTemplate 操作數據
java
@Service
public class RedisExampleService {
private final RedisTemplate<String, Object> redisTemplate;

? ? public RedisExampleService(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}

? ? // 存儲字符串
public void setString(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

? ? // 獲取字符串
public String getString(String key) {
return (String) redisTemplate.opsForValue().get(key);
}

? ? // 存儲 Hash
public void setHash(String key, String field, Object value) {
redisTemplate.opsForHash().put(key, field, value);
}

? ? // 獲取 Hash
public Object getHash(String key, String field) {
return redisTemplate.opsForHash().get(key, field);
}
}
三、序列化機制詳解
RedisTemplate 默認使用 JDK 序列化器,會導致存儲的鍵值帶有類信息前綴(如 \xAC\xED\x00\x05t\x00\x03key),可讀性差且占用空間。
推薦配置 JSON 序列化:
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

? ? ? ? // 使用 Jackson 2 序列化器處理值
Jackson2JsonRedisSerializer<Object> jsonSerializer =?
new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(
om.getPolymorphicTypeValidator(),?
ObjectMapper.DefaultTyping.NON_FINAL
);
jsonSerializer.setObjectMapper(om);

? ? ? ? // 使用 String 序列化器處理鍵
StringRedisSerializer stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
template.setValueSerializer(jsonSerializer);
template.setHashValueSerializer(jsonSerializer);

? ? ? ? template.afterPropertiesSet();
return template;
}
}
四、緩存注解實戰
Spring Data Redis 提供了基于注解的緩存抽象,簡化緩存操作。
核心注解:
@Cacheable:查詢時先查緩存,沒有則執行方法并緩存結果
@CachePut:強制更新緩存(無論是否存在)
@CacheEvict:清除緩存
@Caching:組合多個緩存注解
@CacheConfig:類級別的緩存配置
示例代碼:
java
@Service
@CacheConfig(cacheNames = "users") // 默認緩存名稱
public class UserService {

? ? @Cacheable(key = "#id") // 緩存鍵為方法參數 id
public User getUserById(Long id) {
System.out.println("查詢數據庫: " + id);
return userRepository.findById(id).orElse(null);
}

? ? @CachePut(key = "#user.id") // 更新緩存
public User updateUser(User user) {
return userRepository.save(user);
}

? ? @CacheEvict(key = "#id") // 清除緩存
public void deleteUser(Long id) {
userRepository.deleteById(id);
}

? ? @Caching(
evict = {
@CacheEvict(key = "#id"),
@CacheEvict(cacheNames = "userList", allEntries = true)
}
)
public void deleteAndFlush(Long id) {
userRepository.deleteById(id);
}
}
五、高級特性與最佳實踐
Redis 事務
java
public void transactionExample() {
redisTemplate.execute(new SessionCallback<List<Object>>() {
@Override
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi(); // 開啟事務
operations.opsForValue().set("key1", "value1");
operations.opsForValue().increment("counter");
return operations.exec(); // 執行事務
}
});
}
分布式鎖實現
java
public Boolean acquireLock(String lockKey, String requestId, long expireTime) {
return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return "OK".equals(commands.set(lockKey, requestId, "NX", "PX", expireTime));
});
}

public Boolean releaseLock(String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return commands.eval(script, Collections.singletonList(lockKey),?
Collections.singletonList(requestId))
.equals(1L);
});
}
消息發布與訂閱
java
// 發布者
public void publishMessage(String channel, String message) {
redisTemplate.convertAndSend(channel, message);
}

// 訂閱者配置
@Configuration
public class RedisMessageConfig {
@Bean
RedisMessageListenerContainer container(
RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {

RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
return container;
}

? ? @Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
}

// 消息接收者
@Component
public class Receiver {
public void receiveMessage(String message) {
System.out.println("收到消息: " + message);
}
}


六、性能優化與監控
連接池配置
properties
spring.redis.lettuce.pool.max-active=8 ? # 最大連接數
spring.redis.lettuce.pool.max-wait=-1ms ?# 獲取連接的最大等待時間
spring.redis.lettuce.pool.max-idle=8 ? ? # 最大空閑連接數
spring.redis.lettuce.pool.min-idle=0 ? ? # 最小空閑連接數
慢查詢日志
properties
# redis.conf 配置
slowlog-log-slower-than 10000 ?# 記錄超過 10ms 的命令
slowlog-max-len 128 ? ? ? ? ? ?# 最多保留 128 條日志
內存優化
合理設置過期時間
使用 Hash 結構減少鍵數量
避免大 Value(建議不超過 10KB)
七、集群與高可用
哨兵模式配置
properties
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.1.1:26379,192.168.1.2:26379
spring.redis.password=yourpassword
集群模式配置
properties
spring.redis.cluster.nodes=192.168.1.1:7000,192.168.1.2:7001,192.168.1.3:7002
spring.redis.cluster.max-redirects=3 ?# 最大重定向次數
八、常見問題與解決方案
緩存穿透
空值緩存:查詢不存在時也緩存空結果
布隆過濾器:預先過濾不可能存在的 key
緩存雪崩
過期時間打散:為緩存設置隨機過期時間
多級緩存:本地緩存 + Redis 結合
緩存擊穿
互斥鎖:查詢數據庫時加鎖,保證單線程訪問
永不過期:熱點數據不過期,異步更新
序列化異常
統一序列化方式
確保實體類實現 Serializable 接口
九、總結
Spring Data Redis 提供了強大而靈活的 Redis 操作能力,通過模板類和注解簡化了開發流程。合理使用 Redis 可以顯著提升應用性能,但需要注意分布式環境下的一致性、并發控制等問題。
建議實踐:
優先使用 JSON 序列化
為緩存設置合理的過期時間
對熱點數據進行預加載
監控 Redis 性能指標(內存、QPS、命中率)
生產環境采用集群部署確保高可用

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

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

相關文章

免費版酒店押金原路退回系統——仙盟創夢IDE

項目介紹?東方仙盟開源酒店押金管理系統是一款面向中小型酒店、民宿、客棧的輕量級前臺管理工具&#xff0c;專注于簡化房態管理、訂單處理和押金跟蹤流程。作為完全開源的解決方案&#xff0c;它無需依賴任何第三方服務&#xff0c;所有數據存儲在本地瀏覽器中&#xff0c;確…

10. isaacsim4.2教程-RTX Lidar 傳感器

1. 前言RTX Lidar 傳感器Isaac Sim的RTX或光線追蹤Lidar支持通過JSON配置文件設置固態和旋轉Lidar配置。每個RTX傳感器必須附加到自己的視口或渲染產品&#xff0c;以確保正確模擬。重要提示&#xff1a; 在運行RTX Lidar仿真時&#xff0c;如果你在Isaac Sim UI中停靠窗口&…

QT6 源,七章對話框與多窗體(14)棧式窗體 QStackedWidget:本類里代碼很少。舉例,以及源代碼帶注釋。

&#xff08;1&#xff09;這不是本章節要用到的窗體組件&#xff0c;只是跟著標簽窗體 QTabWidget 一起學了。這也是 QT 的 UI 界面里的最后幾個容器了。而且本類也很簡單。就了解一下它。 本類的繼承關系如下 &#xff1a; UI 設計界面 &#xff1a;運行效果 &#xff1a;&…

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包刷機說明&#xff1a;1&#xff0c;進機頂盒設置&#xff08;密碼10086&#xff09;&#xff0c;在其他里&#xff0c;一直按左鍵約32下&#xff0c;打開調試模式2&#xff0c;進網絡設置&#xff0c;查看IP地址。3&a…

MySQL基礎02

一. 函數在 MySQL 中&#xff0c;函數是用于對數據進行特定處理或計算的工具&#xff0c;根據作用范圍和返回結果的不同&#xff0c;主要分為單行函數和聚合函數&#xff08;又稱分組函數&#xff09;。以下是詳細介紹&#xff1a;1.單行函數單行函數對每一行數據單獨處理&…

LabVIEW 視覺檢測SIM卡槽

針對SIM 卡槽生產中人工檢測效率低、漏檢誤檢率高的問題&#xff0c;設計了基于 LabVIEW 機器視覺的缺陷檢測系統。該系統通過光學采集與圖像處理算法&#xff0c;實現對卡槽引腳折彎、變形、漏銅等缺陷的自動檢測&#xff0c;誤報率為 0&#xff0c;平均檢測時間小于 750ms&am…

RocketMQ5.3.1的安裝

1、下載安裝 RocketMQ 的安裝包分為兩種&#xff0c;二進制包和源碼包。1 下載 Apache RocketMQ 5.3.1的源碼包后上傳到linux https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-source-release.zip2 解壓編譯 $ unzip rocketmq-all-5.3.1-source…

FunASR實時多人對話語音識別、分析、端點檢測

核心功能&#xff1a;FunASR是一個基礎語音識別工具包&#xff0c;提供多種功能&#xff0c;包括語音識別&#xff08;ASR&#xff09;、語音端點檢測&#xff08;VAD&#xff09;、標點恢復、語言模型、說話人驗證、說話人分離和多人對話語音識別等。FunASR提供了便捷的腳本和…

opencv--day01--opencv基礎知識及基礎操作

文章目錄前言一、opencv基礎知識1.opencv相關概念1.1背景1.2特點1.3主要功能與應用1.4.opencv-python2.計算機中的圖像概念2.1圖像表示2.2圖像存儲彩色圖像二、opencv基礎操作1.圖像的讀取2.圖像的顯示3.保存圖像4.創建黑白圖及隨機像素彩圖5. 圖像切片&#xff08;圖片剪裁&am…

如何撤銷Git提交誤操作

要撤銷在主分支上的 git add . 和 git commit 操作&#xff0c;可以按照以下步驟安全回退&#xff1a; 完整回退步驟&#xff1a; # 1. 查看提交歷史&#xff0c;確認要回退的commit git log --oneline# 示例輸出&#xff1a; # d3f4g7h (HEAD -> main) 誤操作提交 # a1b2c3…

React+Three.js實現3D場景壓力/溫度/密度分布可視化

本文介紹了一個基于React和Three.js的3D壓力可視化解決方案&#xff0c;該方案能夠&#xff1a; 加載并渲染3D壓力模型數據 提供動態顏色映射功能&#xff0c;支持多種顏色方案&#xff1a;彩虹-rainbow,冷暖-cooltowarm,黑體-blackbody,灰度-grayscale 實現固定位置的顏色圖…

Go 官方 Elasticsearch 客戶端 v9 快速上手與進階實踐*

1、為什么選擇 go-elasticsearch&#xff1f; 版本同步&#xff1a;與 Elasticsearch 主版本保持一一映射&#xff0c;當前穩定分支為 v9&#xff0c;對應 ES 9.x 系列。(GitHub)完全覆蓋 REST API&#xff1a;所有 HTTP 端點都有等價方法&#xff0c;避免手寫 JSON/HTTP。可插…

`/etc/samba/smb.conf`筆記250720

/etc/samba/smb.conf筆記250720 /etc/samba/smb.conf 是 Samba 服務的核心配置文件&#xff0c;用于實現 Linux/Unix 與 Windows 系統間的文件和打印機共享。以下詳解其結構和常用參數&#xff1a; 配置文件結構 1. 全局設置段 [global] 控制 Samba 服務器的整體行為。 …

Java從入門到精通!第十六天,重點!(多線程和線程池)

一、多線程1&#xff0e;基本概念&#xff08;1&#xff09;程序&#xff08;Program&#xff09;&#xff1a;為了完成特定的任務&#xff0c;用某種計算機語言編寫的一組指令的集合&#xff0c;即指一段靜態的代碼&#xff08;源代碼經編譯之后形成的二進制格式的文件&#x…

軌道交通為什么要有信號系統?

軌道交通為什么要有信號系統&#xff1f;軌道交通信號系統與公路信號系統有什么不同&#xff1f; 在軌道交通中信號系統是必不可少的&#xff0c;其根本原因在于&#xff1a;在軌道交通中已經沒有辦法純靠人力去保證行車安全。 在公路交通中&#xff0c;信號其實是起輔助作用的…

docker 掛載卷

以下是針對您遇到的問題分步解答和解決方案&#xff1a;一、核心結論 ? 可以采用目錄方式&#xff1a;您的命令中的 -v /root/nginx05-vol/:/usr/share/nginx/html/ 是正確的目錄掛載語法。 ? 看不到新文件的可能原因主要集中在 權限問題、緩存機制 或 操作順序錯誤 上。二、…

uniapp 報錯 Not found ... at view.umd.min.js:1的問題

問題描述&#xff1a; uniapp的app中&#xff0c;當頁面中使用多個v-if后會出現這個報錯解決方案&#xff1a; 1、在v-if的地方加上key屬性&#xff08;key屬性要保證唯一&#xff09; 2、用v-show替換v-if&#xff08;不建議&#xff0c;可能會影響業務&#xff09;

水電站自動化升級:Modbus TCP與DeviceNet的跨協議協同應用

水電站的自動化系統就像一個精密的“神經中樞”&#xff0c;既要應對水流變化帶來的動態負載&#xff0c;又得保證閘門啟閉、水輪機調節等關鍵動作的精準性。我們去年參與的某水電站改造項目里&#xff0c;就遇到了一個典型問題&#xff1a;中控室的施耐德PLC采用Modbus TCP協議…

基于Matlab圖像處理的火災檢測系統設計與實現

隨著計算機視覺技術的快速發展&#xff0c;基于圖像處理的火災檢測系統在安全監控領域的應用得到了廣泛關注。本文提出了一種基于圖像處理的火災檢測系統&#xff0c;該系統通過對圖像進行預處理、顏色空間轉換、閾值化處理和形態學分析&#xff0c;自動檢測火災疑似區域。首先…

信息學奧賽一本通 1593:【例 2】牧場的安排 | 洛谷 P1879 [USACO06NOV] Corn Fields G

【題目鏈接】 ybt 1593&#xff1a;【例 2】牧場的安排 洛谷 P1879 [USACO06NOV] Corn Fields G 【題目考點】 1. 狀壓動規 【解題思路】 集合狀態&#xff1a;n個元素中&#xff0c;選擇x個元素構成的集合&#xff0c;可以由一個n位二進制數表示。第i位為1表示選擇第i個元…