如何用Spring Cache實現對Redis的抽象

我們在進行Java項目開發時候,經常會用到Redis緩存例如數據庫里的一些信息、手機驗證碼之類的,正常寫法就會像去連mysql一樣,這種硬編碼的方式肯定是非常不合適的。

  @Autowireprivate UserMapper userMapper;@Autowireprivate StringCommand stringCommand;//查詢用戶public User getUserById(Long userId) {String cacheKey = "userId_" + userId;User user=stringCommand.get(cacheKey);if(user != null) {return user;}user = userMapper.getUserById(userId);if(user != null) {stringCommand.set(cacheKey,user);return user;}//修改用戶public void updateUser(User user){userMapper.updateUser(user);String cacheKey = "userId_" + userId.getId();stringCommand.set(cacheKey , user);}//刪除用戶public void deleteUserById(Long userId){userMapper.deleteUserById(userId);String cacheKey = "userId_" + userId.getId();stringCommand.del(cacheKey);}}

有沒有啥更抽象、更優雅的方式來實現呢?

有!那就是使用Spring Cache,它是一個對緩存的抽象,即使使用的緩存不是Redis也可以。
在這里插入圖片描述
我們看到這里最重要的是這個CacheManager,是他給我們提供了一個抽象,讓我們不用關心底層緩存技術(如 Redis、Ehcache、Caffeine)

那如何使用呢?
當然是通過Spring中最常見的方式——注釋了 !!!這也是CacheManager提供給我們的功能
在這里插入圖片描述
在pom文件下引入對應包(spring-boot-starter-data-redis、spring-boot-starter-cache)后,在啟動類上加@EnableCaching注釋,就可以使用Spring Cache的功能了。

這里再解釋一下注釋里的value和key分別是啥:

  • 首先value指定的是緩存的名稱,對應底層 Redis 的 key 前綴或 hash 名,也就是你緩存數據時存在哪個“區域”。比如下面這個示例,緩存內容都是存入名為 userCache 的緩存區。
  • key則是指定緩存項在緩存區中的唯一標識。如果不指定,Spring 會默認根據方法所有參數自動生成一個 key。
// 先查緩存,有則返回緩存內容;如果沒有,執行方法,并把返回值放進緩存。
@Cacheable(value = "userCache", key = "#id")
public User getUserById(Long id) {// 方法體只會在緩存未命中時執行return userService.getUserFromDB(id);
}// 還有一種寫法,假設查詢對應id用戶為空時,這樣可以讓查詢結果不緩存
// unless表示條件成立時,不緩存,也就是說:如果方法返回結果是 null,則不緩存
@Cacheable(value = "userCache", key = "#id", unless = "#result == null")
public User getUserById(Long id) {// 方法體只會在緩存未命中時執行return userService.getUserFromDB(id);
}// 不查緩存,始終執行方法,然后將方法返回值更新到緩存中。
@CachePut(value = "userCache", key = "#user.id")
public User updateUser(User user) {// 更新數據庫return userRepository.save(user);
}// 刪除緩存中的數據,可以指定 key,也可以一次清空整個緩存。
@CacheEvict(value = "userCache", key = "#id")
// @CacheEvict(value = "userCache", allEntries = true) 這個是全部清空
public void deleteUser(Long id) {// 刪除數據庫中的數據userRepository.deleteById(id);
}

還需要強調的一點,可能你會知道RedisTemplate,在我另一篇文章也講了,這是一種給你手動操作Redis數據的方式,你可以調用.opsForXXX()來獲取數據,是一種更加靈活、精細操作Redis的方式,例如在實現分布式鎖等場景可以采用。但我們本文介紹的CacheManager是通過注釋的方式自動操作緩存的,是一種方法級的自動緩存,簡潔優雅,推薦用于 Controller/Service 層。

來個更加易懂的方式來解釋,RedisTemplate像是你手動操作數據庫的 JDBC 接口,而CacheManager則像是用 ORM 框架(比如 MyBatis)配置好后,通過注解自動執行數據庫操作。

@Configuration
@EnableCaching // 開啟Spring Cache注解支持,這樣的話就可以直接使用@@Cacheable、@CachePut、@CacheEvict等注釋來用了,當然如果你已經在主程序上標了,這里就不用寫了,@EnableCaching全局寫一次就行
public class RedisConfig {@Beanpublic RedisCacheManager redisCacheManager(RedisConnectionFactory factory, CacheTtlProperties ttlProps) {// 創建默認緩存配置:設置序列化方式、key前綴、是否緩存null值、默認過期時間等RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // key 使用字符串序列化.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // value 使用 JSON 序列化// 創建一個 map 存放不同緩存區域(cacheName)對應的 TTL(過期時間)配置Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();// 從application.yml配置中讀取每個緩存區域自定義的 TTL,并生成對應的配置項for (Map.Entry<String, Long> entry : ttlProps.getTtl().entrySet()) {cacheConfigurations.put(entry.getKey(),defaultConfig.entryTtl(Duration.ofMillis(entry.getValue()))); // 將該 cacheName 設置為自定義 TTL}// 構建 RedisCacheManager:指定默認配置及每個緩存區域的個性化配置return RedisCacheManager.builder(factory).cacheDefaults(defaultConfig) // 設置默認緩存行為.withInitialCacheConfigurations(cacheConfigurations) // 設置個性化緩存行為.build(); // 構建緩存管理器}
}

然后記得在application.yml配置對應參數,例如過期時間等:

spring:redis:host: localhost # Redis 服務地址port: 6379       # Redis 端口號cache:type: redis      # 使用 Redis 作為緩存實現redis:time-to-live: 1800000 # 全局默認緩存過期時間(單位:毫秒,1800000ms = 30分鐘)cache-null-values: false # 是否緩存 null,false 表示不緩存 null 值,假設想在每個地方自行判斷要不要緩存null可以不寫這行use-key-prefix: true     # 是否啟用 key 前綴key-prefix: cache::      # 緩存 key 的統一前綴,也就是key都變成了cache::xxx
// 上面配置的是全局緩存過期時間,你如果還想單獨指定redis緩存空間例如userCache、orderCache的過期時間可以寫在下面,其余的空間仍然是30分鐘
custom:cache:ttl:userCache: 600000     # userCache 緩存區域的 TTL(單位:毫秒,600000ms = 10分鐘)orderCache: 3600000   # orderCache 緩存區域的 TTL(單位:毫秒,3600000ms = 1小時)

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

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

相關文章

CMake指令:file()

目錄 1.簡介 2.常用子命令&#xff08;COMMAND&#xff09; 2.1.COPY - 復制文件或目錄 2.2.RENAME - 重命名文件或目錄 2.3.REMOVE - 刪除文件或目錄 2.4.MAKE_DIRECTORY - 創建目錄 2.5.READ - 讀取文件內容 2.6.WRITE - 寫入文件內容 2.7.GLOB - 按模式匹配文件 2…

使用VuePress開發日志

結合官方教程&#xff0c;補充一些細節。 快速上手 | VuePress中文文檔 | VuePress中文網 VuePress使用步驟 創建并進入一個新目錄 mkdir vuepress-starter && cd vuepress-starter使用你喜歡的包管理器進行初始化 yarn init # npm init將 VuePress 安裝為本地依賴 …

隨手記錄7

2025年5月26日~2025年6月01日 周一&#xff1a;沒做 周二&#xff1a;芹菜炒雞蛋香腸 周三&#xff1a; 周四&#xff1a; 周五&#xff1a; 周六&#xff1a; 周日&#xff1a;

【無標題】使用JEasyOpc開發OPCDA采集中間件

使用JEasyOpc開發OPCDA采集中間件 1.JEasyOpc下載2.修改JEasyOpc源碼及打包安裝3.Pom 引入jeasy2.3.2.jar4.maven pom 配置打包5.cmd執行&#xff08;手動指定 main主程序入口&#xff09;6.EXE4J打包jar包&#xff0c;生成exe可執行文件 1.JEasyOpc下載 jeasyopc源碼下載&…

5 WPF中的Page頁面的使用

以下是一個簡單的WPF示例&#xff0c;演示如何在三個Page之間進行導航切換&#xff0c;使用Frame控件作為導航容器&#xff0c;并包含基本的導航按鈕&#xff08;前進/后退/主頁&#xff09; Page類更簡單&#xff0c;比Window更精簡。 代碼見下文以及資源文件&#xff1a; htt…

基于51單片機的音樂盒點陣屏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1hYzg2icjHV8jWJdltJkKxw 提取碼&#xff1a;1234 仿真圖&#xff1a; 芯片/模塊的特點&#xff1a; AT89C52/AT89C51簡介&#xff1a; AT89C51 是一款常用的 8 位單片機&#xff0c;由 Atmel 公司&#xff08;現已被 Microchip 收…

圖論:floyed算法

Floyd 算法是一種用于尋找加權圖中所有頂點對之間最短路徑的經典算法&#xff0c;它能夠處理負權邊&#xff0c;但不能處理負權環。即如果邊權有負數&#xff0c;切負權邊與其他邊構成了環就不能用該算法。該算法的時間復雜度為 \(O(V^3)\)&#xff0c;其中 V 是圖中頂點的數量…

STM32之看門狗(IWDG)

一、看門狗外設的原理與應用 背景說明 隨著單片機的發展&#xff0c;單片機在家用電器、工業自動化、生產過程控制、智能儀器儀表等領域的應用越來越廣泛。然而處于同一電力系統中的各種電氣設備通過電或磁的聯系彼此緊密相連&#xff0c;相互影響&#xff0c;由于運行方式的…

#RabbitMQ# 消息隊列進階

目錄 消息可靠性 一 生產者的可靠性 1 生產者的重連 2 生產者的確認 (1 Confirm* (2 Return 二 MQ的可靠性 1 數據持久化 2 Lazy Queue* 三 消費者的可靠性 1 消費者確認機制 2 消費失敗處理 3 業務冪等性 四 延遲消息 消息可靠性 在消息隊列中&#xff0c;可靠性…

《計算機組成原理》第 10 章 - 控制單元的設計

目錄 10.1 組合邏輯設計 10.1.1 組合邏輯控制單元框圖 10.1.2 微操作的節拍安排 10.1.3 組合邏輯設計步驟 10.2 微程序設計 10.2.1 微程序設計思想的產生 10.2.2 微程序控制單元框圖及工作原理 10.2.3 微指令的編碼方式 1. 直接編碼&#xff08;水平型&#xff09; 2.…

AstroNex空間任務智能控制研究與訓練數據集

數據集概述 AstroNex空間任務智能控制研究與訓練數據集是朗迪鋒科技基于Multiverse平臺精心打造的首個全面覆蓋航天器智能控制全周期的綜合數據集產品。該數據集匯集了軌道動力學、姿態控制、機器視覺、環境感知等多維度數據&#xff0c;為航天器智能算法研發提供豐富的訓練與…

??3D 幾何建模工具庫?Open CASCADE(OCCT)簡單介紹。

??Open CASCADE&#xff08;OCCT&#xff09;?? 的新手&#xff0c;我會用最簡單的方式幫你理解它是什么、能做什么&#xff0c;以及如何快速上手。 ??1. OCCT 是什么&#xff1f;?? ??一句話定義??&#xff1a;OCCT 是一個開源的 ??3D 幾何建模工具庫??&…

[7-1] ADC模數轉換器 江協科技學習筆記(14個知識點)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 DMA&#xff08;Direct Memory Access&#xff0c;直接內存訪問&#xff09;是一種硬件特性&#xff0c;它允許某些硬件子系統直接訪問系統的內存&#xff0c;而無需CPU的介入。這樣&#xff0c;CPU就可以處理其他任務&#xff0c;從而提高系…

篇章三 基礎——不可變類

目錄 1.是什么 2.為什么 3.怎么做 4.構造詳細的不可變類示例: 5.補充 5.1 Java標準庫中的不可變類 5.2 構造不可變類進階 1.對象包含嵌套的引用類型字段 2. 大型對象采用不可變類時,需考慮性能影響。 2.1 內存占用問題 2.2 垃圾回收壓力 2.3 復制開銷 2.4 優化策…

cuda ncu section 含義解釋

NVIDIA Nsight Compute (NCU) 是用于分析 CUDA 程序性能的工具&#xff0c;通過 Sections 組織性能指標。用戶提供的 24 個 Sections 涵蓋了計算、內存、調度、互連和可視化等方面。本報告詳細解釋每個 Section 的含義、用途及相關分析場景。 Sections 詳細解析 C2CLink 含義&…

NGINX HTTP/2 全面指南開啟、調優與實戰

一、為什么要用 HTTP/2&#xff1f; 多路復用&#xff08;Multiplexing&#xff09; 單連接上可并發交錯發送多路請求&#xff0c;避免了 HTTP/1.x 中的隊頭阻塞&#xff08;Head-Of-Line Blocking&#xff09;。頭部壓縮&#xff08;HPACK&#xff09; 對 HTTP 頭部字段進行高…

手寫簡單的tomcat

首先&#xff0c;Tomcat是一個軟件&#xff0c;所有的項目都能在Tomcat上加載運行&#xff0c;Tomcat最核心的就是Servlet集合&#xff0c;本身就是HashMap。Tomcat需要支持Servlet&#xff0c;所以有servlet底層的資源&#xff1a;HttpServlet抽象類、HttpRequest和HttpRespon…

智能體賦能效率,企業知識庫沉淀價值:UMI企業智腦的雙輪驅動!

智能體企業知識庫&#xff1a;UMI企業智腦的核心功能與價值 在人工智能技術飛速發展的今天&#xff0c;企業智能化轉型已經成為不可逆轉的趨勢。作為企業級AI智能體開發平臺的佼佼者&#xff0c;優秘智能推出的UMI企業智腦&#xff0c;以其強大的智能體開發能力和全面的企業知…

與 PyCharm 官方溝通解決開發環境問題記錄(進展:官方已推出2個新的修復版本)

??????主題&#xff1a;有關 PyCharm 中終端和環境激活問題的反饋&#xff1a;PY-81233 前言 目前進展&#xff1a; 官方已有2個修復版本推出測試。 更新方法&#xff1a; 使用JetBrains Toolbox App&#xff0c;如下圖所示&#xff0c;從“其他版本”進入查看更新。…

LINUX安裝運行jeelowcode后端項目(命令行)

環境準備 運行環境&#xff1a;JDK1.8開發工具&#xff1a; Idea、Maven默認已啟動中間件&#xff1a;&#xff08;推薦使用寶塔&#xff09;Mysql8.0、Redis、Minio第一步&#xff1a;下載JeelowCode項目并導入IDEA中 第二步&#xff1a;導入數據庫文件到mysql中&#xff0c;…