目錄
為什麼要使用Redis進行緩存?
步驟1:設置Redis和依賴關係
步驟2:在Spring Boot中配置Redis
步驟3:啟用並使用緩存註釋
步驟4:處理緩存到期和驅逐
步驟5:監視和測試緩存
最佳實踐
首頁 Java java教程 在使用REDIS的Java應用程序中實現緩存層

在使用REDIS的Java應用程序中實現緩存層

Jul 30, 2025 am 03:30 AM

redis用於緩存Java應用程序中,以通過減少數據庫負載並啟用快速數據檢索來提高性能。 1。使用Docker安裝Redis:Docker Run -D -P 6379:6379 Redis。 2。在pom.xml中添加Spring-boot-starter-starter-data-redis和生菜核依賴性。 3。在Application.YML中配置Redis連接,並帶有主機,端口和池設置。 4。使用@enableCaching創建一個重案類課程,使用GenericJackson2JsonRedisserializer自定義JOSON序列化重新標誌。 5。使用@cachable從高速緩存或執行和緩存,@cacheput檢索執行後更新緩存,以及@cacheevict刪除緩存數據。 6。定義帶有EntryTTL(持續時間的Rediscachemanager bean)設置10分鐘到期。 7.使用redis-cli命令(如鍵 *)監視緩存,並獲取“用戶:: 1”。 8。編寫單元測試以驗證緩存命中和錯過。最佳實踐包括使用有意義的鑰匙,避免在緩存中避免使用大或敏感的數據,優雅地處理緩存以及在啟動時可選地加熱緩存。與Spring Boot的集成簡化了緩存的實現,同時顯著提高了應用程序性能和可伸縮性。

在使用REDIS的Java應用程序中實現緩存層

使用REDIS將緩存層添加到Java應用程序中,可以通過減少數據庫負載並加速數據檢索可以顯著提高性能。這是有效實施的方法。

在使用REDIS的Java應用程序中實現緩存層

為什麼要使用Redis進行緩存?

REDIS是一種內存數據存儲,以其速度,靈活性和對各種數據結構的支持而聞名。這是緩存的理想選擇,因為:

  • 數據存儲在RAM中,啟用子毫秒讀/寫操作。
  • 它支持到期(TTL),這有助於管理過時的數據。
  • 它通過生菜和Jedis等客戶與Java很好地集成在一起。

步驟1:設置Redis和依賴關係

首先,確保Redis正在運行。您可以在本地安裝它或使用Docker:

在使用REDIS的Java應用程序中實現緩存層
 Docker Run -D -P 6379:6379 Redis

然後,將所需的依賴項添加到您的pom.xml (用於maven):

 <依賴項>
    <groupId> org.springframework.boot </groupId>
    <Artifactid> Spring-boot-starter-data-redis </artifactid>
</dependency>
<依賴項>
    <groupId> io.lettuce </groupId>
    <Artifactid>生菜核</artifactid>
</dependency>

生菜是由於其異步和非阻滯功能而推薦的春季啟動的Redis客戶端。

在使用REDIS的Java應用程序中實現緩存層

步驟2:在Spring Boot中配置Redis

application.ymlapplication.properties中,配置redis連接:

春天:
  redis:
    主持人:Localhost
    港口:6379
    萵苣:
      水池:
        最大活性:8
        Max-Idle:8
        Min-idle:0

您還可以在需要時自定義RedisConnectionFactory factory和RedisTemplate

 @配置
@enablecaching
公共類RedisconFig {

    @豆
    public redistemplate <string,object> redistemplate(redisconnection -factory connectionFactory){
        REDISTEMPLATE <String,Object> Template = new Redistemplate <>();
        template.setConnectionFactory(ConnectionFactory);
        template.setKeySerializer(new StringRedisserializer());
        template.setValueserializer(new GenericJackson2JsonRedisserializer());
        返回模板;
    }
}

使用GenericJackson2JsonRedisSerializer允許複雜的Java對象序列化與JSON並存儲在REDIS中。


步驟3:啟用並使用緩存註釋

@EnableCaching註釋您的主應用程序類或配置類。

 @springbootapplication
@enablecaching
公共類應用程序{
    公共靜態void main(string [] args){
        springapplication.run(application.class,args);
    }
}

現在在服務層中使用緩存註釋:

 @服務
公共類用戶服務{

    @Autowired
    私人用戶repository userrepository;

    @cachable(value =“用戶”,key =“ #id”)
    公共用戶getuserById(長ID){
        system.out.println(“從db中獲取用戶:” id);
        返回userrepository.findbyid(id).orelse(null);
    }

    @cacheput(value =“用戶”,key =“#user.id”)
    公共用戶UpdateUser(用戶用戶){
        返回userrepository.save(用戶);
    }

    @cacheevict(value =“用戶”,key =“ #id”)
    public void deleteuser(長ID){
        userrepository.deletebyid(id);
    }
}
  • @Cacheable :首先檢查緩存。如果存在,則返回緩存的值;否則,執行該方法並緩存結果。
  • @CachePut :始終執行方法並更新緩存。
  • @CacheEvict :從緩存中刪除條目(用於刪除操作)。

步驟4:處理緩存到期和驅逐

設置ttl(延續時間)以避免過時的數據。您可以通過配置在全球範圍內定義它:

 @豆
public rediscachemanager cachemanager(RedisconnectionFactory ConnectionFactory){
    rediscacheconfiguration config = rediscacheconfiguration.defaultcacheconfig()
        .entryttl(持續時間。
        。
        .SerializeValuesWith(redisserializationContext.Serializationpair.FromSerializer(new GenericJackson2JsonRedisserializer()));

    返回rediscacheManager.builder(Connection Factory)
        .cachedefaults(config)
        。建造();
}

這樣可以確保10分鐘後自動刪除緩存的用戶。


步驟5:監視和測試緩存

使用Redis CLI檢查緩存的數據:

 redis-cli
>鍵 *
>獲取“用戶:: 1”

另外,編寫單元測試以驗證緩存行為:

 @測試
void shosecacheuseronfirstCall(){
    uservice.getuserbyid(1L); // DB命中
    uservice.getuserbyid(1L); //應該緩存
    //驗證DB僅稱為一次
}

使用Spring的CacheManager或Logging等工具確認命中/錯過。


最佳實踐

  • 使用有意義的緩存鍵:優先使用@Cacheable(value = "users", key = "#id")而不是複雜或長鍵。
  • 避免緩存大或敏感的數據:保持緩存輕巧且安全。
  • 緩存遺漏的計劃:如果REDIS關閉或數據未緩存,您的應用程序仍應工作。
  • 如果需要,請在啟動過程中使用緩存加熱進行關鍵數據。

基本上,將Redis作為Java中的緩存層集成(尤其是帶有Spring Boot)的簡單明了,並且可以立即獲得性能增長。通過適當的配置和智能使用註釋,您可以減少延遲和數據庫壓力而不會使代碼複雜化。

以上是在使用REDIS的Java應用程序中實現緩存層的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

Rimworld Odyssey溫度指南和Gravtech
1 個月前 By Jack chen
Rimworld Odyssey如何釣魚
1 個月前 By Jack chen
我可以有兩個支付帳戶嗎?
1 個月前 By 下次还敢
初學者的Rimworld指南:奧德賽
1 個月前 By Jack chen
PHP變量範圍解釋了
3 週前 By 百草

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1603
29
PHP教程
1508
276
Hashmap在Java內部如何工作? Hashmap在Java內部如何工作? Jul 15, 2025 am 03:10 AM

HashMap在Java中通過哈希表實現鍵值對存儲,其核心在於快速定位數據位置。 1.首先使用鍵的hashCode()方法生成哈希值,並通過位運算轉換為數組索引;2.不同對象可能產生相同哈希值,導致衝突,此時以鍊錶形式掛載節點,JDK8後鍊錶過長(默認長度8)則轉為紅黑樹提升效率;3.使用自定義類作鍵時必須重寫equals()和hashCode()方法;4.HashMap動態擴容,當元素數超過容量乘以負載因子(默認0.75)時,擴容並重新哈希;5.HashMap非線程安全,多線程下應使用Concu

如何處理Java中的字符編碼問題? 如何處理Java中的字符編碼問題? Jul 13, 2025 am 02:46 AM

處理Java中的字符編碼問題,關鍵是在每一步都明確指定使用的編碼。 1.讀寫文本時始終指定編碼,使用InputStreamReader和OutputStreamWriter並傳入明確的字符集,避免依賴系統默認編碼。 2.在網絡邊界處理字符串時確保兩端一致,設置正確的Content-Type頭並用庫顯式指定編碼。 3.謹慎使用String.getBytes()和newString(byte[]),應始終手動指定StandardCharsets.UTF_8以避免平台差異導致的數據損壞。總之,通過在每個階段

Java中的可比較與比較器 Java中的可比較與比較器 Jul 13, 2025 am 02:31 AM

在Java中,Comparable用於類內部定義默認排序規則,Comparator用於外部靈活定義多種排序邏輯。 1.Comparable是類自身實現的接口,通過重寫compareTo()方法定義自然順序,適用於類有固定、最常用的排序方式,如String或Integer。 2.Comparator是外部定義的函數式接口,通過compare()方法實現,適合同一類需要多種排序方式、無法修改類源碼或排序邏輯經常變化的情況。兩者區別在於Comparable只能定義一種排序邏輯且需修改類本身,而Compar

如何在Java的地圖上迭代? 如何在Java的地圖上迭代? Jul 13, 2025 am 02:54 AM

遍歷Java中的Map有三種常用方法:1.使用entrySet同時獲取鍵和值,適用於大多數場景;2.使用keySet或values分別遍歷鍵或值;3.使用Java8的forEach簡化代碼結構。 entrySet返回包含所有鍵值對的Set集合,每次循環獲取Map.Entry對象,適合頻繁訪問鍵和值的情況;若只需鍵或值,可分別調用keySet()或values(),也可在遍歷鍵時通過map.get(key)獲取值;Java8中可通過Lambda表達式使用forEach((key,value)-&gt

Java中的'靜態”關鍵字是什麼? Java中的'靜態”關鍵字是什麼? Jul 13, 2025 am 02:51 AM

InJava,thestatickeywordmeansamemberbelongstotheclassitself,nottoinstances.Staticvariablesaresharedacrossallinstancesandaccessedwithoutobjectcreation,usefulforglobaltrackingorconstants.Staticmethodsoperateattheclasslevel,cannotaccessnon-staticmembers,

如何在Windows中設置Java_home環境變量 如何在Windows中設置Java_home環境變量 Jul 18, 2025 am 04:05 AM

tosetjava_homeonwindows,firstLocateThejDkinStallationPath(例如,C:\ programFiles \ java \ jdk-17),tencreateasyemystemenvironmentvaria blenamedjava_homewiththatpath.next,updateThepathvariaby byadding%java \ _home%\ bin,andverifyTheSetupusingjava-versionAndjavac-v

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務,必須先關閉自動提交模式,再執行多個操作,最後根據結果提交或回滾;1.調用conn.setAutoCommit(false)以開始事務;2.執行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調用conn.commit(),若發生異常則調用conn.rollback()確保數據一致性;同時應使用try-with-resources管理資源,妥善處理異常並關閉連接,避免連接洩漏;此外建議使用連接池、設置保存點實現部分回滾,並保持事務盡可能短以提升性能。

Java虛擬線程性能基準測試 Java虛擬線程性能基準測試 Jul 21, 2025 am 03:17 AM

虚拟线程在高并发、IO密集型场景下性能优势显著,但需注意测试方法与适用场景。1.正确测试应模拟真实业务尤其是IO阻塞场景,使用JMH或Gatling等工具对比平台线程;2.吞吐量差距明显,在10万并发请求下可高出几倍至十几倍,因其更轻量、调度高效;3.测试中需避免盲目追求高并发数,适配非阻塞IO模型,并关注延迟、GC等监控指标;4.实际应用中适用于Web后端、异步任务处理及大量并发IO场景,而CPU密集型任务仍适合平台线程或ForkJoinPool。

See all articles