🏆本文收錄於「滾雪球學SpringBoot」專欄,手把手帶你零基礎入門springboot,從入門到就業,助你早日登頂實現財富自由🚀;同時,歡迎大家關注&&收藏&&訂閲!持續更新中,up!up!up!!
環境説明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
🚀 前言 🔥
在現代應用中,緩存已成為提高應用性能的關鍵技術。特別是在處理大量併發請求和頻繁訪問數據時,緩存能夠大幅度提升系統的響應速度與可擴展性。Spring Boot作為一個開箱即用的框架,提供了極為便捷的緩存集成功能。在眾多緩存實現中,Ehcache作為本地緩存和Redis作為分佈式緩存,在Spring Boot中被廣泛使用。今天,我們將詳細探討如何在Spring Boot項目中集成Ehcache和Redis,並介紹緩存策略和如何自定義緩存策略,以進一步提升系統性能。
目錄 📚
- 🌟 緩存概述與常見策略
- 🧩 Spring Boot 緩存抽象層
- 🛠️ 使用Ehcache作為本地緩存
- 🔥 集成Redis緩存
- 🔧 自定義緩存策略與註解使用
🌟 緩存概述與常見策略 🧠
緩存是存儲數據副本的機制,旨在減少從遠程數據源(如數據庫或外部API)獲取數據的頻率,從而減少延遲並提高應用的響應速度。通過緩存技術,我們可以把訪問頻繁的數據存儲在內存中,避免每次都進行昂貴的計算或I/O操作。
常見緩存策略:
-
**LRU(Least Recently Used,最近最少使用)**:
- 這是最常見的緩存替換策略,當緩存滿時,LRU會刪除最近最少被訪問的緩存數據。非常適用於需要存儲有限數據量的場景。
-
**LFU(Least Frequently Used,最不常使用)**:
- LFU策略會刪除訪問次數最少的數據。這對於那些訪問頻率差異較大的數據訪問場景非常有效。
-
**TTL(Time-to-Live,生存時間)**:
- TTL策略會給緩存的數據設置一個過期時間,超過這個時間後數據會被自動刪除。適合於需要定期更新的數據。
-
**寫時緩存(Write-through Cache)**:
- 當寫入數據時,首先寫入緩存,再寫入數據庫。這種策略適合數據一致性要求較高的場景。
-
**異步寫緩存(Write-back Cache)**:
- 數據首先寫入緩存,數據庫的寫操作被延遲,緩存會定期將數據寫入數據庫。這有助於減少對數據庫的訪問量,但會增加數據一致性的挑戰。
常見的緩存策略幫助我們根據具體的應用場景選擇合適的策略。在Spring Boot項目中,我們可以通過緩存註解靈活配置緩存行為,並通過集成像Ehcache和Redis這樣的緩存框架來優化應用的性能。
🧩 Spring Boot 緩存抽象層 🌐
Spring Boot提供了一個非常強大的緩存抽象層,它允許我們在不同的緩存提供者(如Ehcache、Redis、Caffeine等)之間切換,而無需改變業務代碼。這個抽象層簡化了緩存的管理,同時也提高了緩存的靈活性。
1️⃣ 開啓緩存功能
在Spring Boot中,啓用緩存功能非常簡單,只需要在主配置類上添加@EnableCaching註解:
@SpringBootApplication
@EnableCaching // 啓用緩存功能
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@EnableCaching註解告訴Spring Boot啓用緩存機制,Spring會自動配置並管理緩存相關的Bean。
2️⃣ 使用緩存註解
Spring Boot的緩存註解非常簡潔,主要使用以下幾種常見的註解:
@Cacheable:用於標記方法結果需要緩存,當方法被調用時,Spring會先檢查緩存中是否已經有結果,如果有則直接返回緩存數據,如果沒有則執行方法並將結果緩存起來。@CachePut:每次調用時都會更新緩存,不管方法是否執行過。@CacheEvict:用於刪除緩存中的數據。
示例:
@Service
public class UserService {
@Cacheable(value = "users", key = "#id") // 緩存查詢結果
public User getUserById(Long id) {
return userRepository.findById(id);
}
@CachePut(value = "users", key = "#user.id") // 更新緩存
public User updateUser(User user) {
return userRepository.save(user);
}
@CacheEvict(value = "users", key = "#id") // 刪除緩存
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
@Cacheable(value = "users", key = "#id")表示getUserById方法的結果會根據用户ID被緩存起來。@CachePut會在每次調用updateUser時,更新緩存中的數據。@CacheEvict表示刪除指定ID的用户緩存。
🛠️ 使用Ehcache作為本地緩存 💾
Ehcache是一個非常流行的本地緩存框架,它適用於那些對緩存一致性要求較低,且數據量較小的應用場景。在Spring Boot中集成Ehcache非常簡單,Spring Boot提供了官方的spring-boot-starter-cache支持。
1️⃣ 配置Ehcache
首先,我們需要在application.properties或application.yml中配置Ehcache。
spring.cache.type=ehcache
Spring Boot會根據此配置使用Ehcache作為緩存提供者。
2️⃣ 配置Ehcache的XML文件
Ehcache使用XML配置文件來定義緩存的行為。例如,我們可以創建一個名為ehcache.xml的配置文件,指定緩存的大小和過期策略:
<config xmlns="http://www.ehcache.org/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<cache alias="usersCache">
<heap>1000</heap>
<expiry>
<ttl unit="seconds">300</ttl> <!-- 設置緩存過期時間為300秒 -->
</expiry>
</cache>
</config>
<heap>設置緩存的最大數量。<ttl>設置緩存項的存活時間。
然後,在Spring Boot的配置類中指定ehcache.xml文件的位置:
spring.cache.ehcache.config=classpath:ehcache.xml
3️⃣ 使用Ehcache
通過@Cacheable註解,我們可以輕鬆使用Ehcache緩存方法結果:
@Service
public class ProductService {
@Cacheable(value = "products", key = "#productId")
public Product getProduct(Long productId) {
// 執行查詢邏輯
}
}
Ehcache會自動將getProduct方法的查詢結果緩存起來,避免重複查詢數據庫。
🔥 集成Redis緩存 🌍
Redis是一個高性能的分佈式緩存系統,廣泛應用於需要分佈式、可擴展的場景。Spring Boot對Redis的集成非常簡單,可以通過spring-boot-starter-data-redis來實現。
1️⃣ 添加Redis依賴
首先,在pom.xml文件中添加Redis相關的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2️⃣ 配置Redis
在application.properties中配置Redis連接信息:
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
3️⃣ 使用Redis緩存
Redis的使用方式與Ehcache類似,同樣通過@Cacheable等註解進行緩存。你只需將value屬性設置為Redis緩存名稱即可:
@Service
public class OrderService {
@Cacheable(value = "orders", key = "#orderId")
public Order getOrder(Long orderId) {
return orderRepository.findById(orderId);
}
}
Redis緩存會存儲在Redis服務器中,具有良好的擴展性和高可用性,非常適合處理大規模的數據。
🔧 自定義緩存策略與註解使用 📝
Spring Boot允許我們根據需求自定義緩存策略,例如自定義緩存的過期時間、緩存大小等。通過@Cacheable、@CacheEvict和@CachePut等註解的靈活使用,我們可以輕鬆地實現緩存的管理。
1️⃣ 自定義緩存過期時間
對於Redis,可以使用@Cacheable註解的@CacheConfig自定義緩存的過期策略。例如,為了實現不同緩存的過期策略,可以使用CacheManager。
@Bean
public CacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate) {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
.builder(redisTemplate.getConnectionFactory())
.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(60))); // 設置緩存過期時間
return builder.build();
}
2️⃣ 更復雜的緩存策略
如果你有更復雜的緩存需求,可以通過自定義CacheManager來設置不同緩存的策略:
@Bean
public CacheManager cacheManager() {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10)) // 設置緩存默認存活時間
.disableCachingNullValues();
return RedisCacheManager.builder(RedisConnectionFactory)
.cacheDefaults(config)
.build();
}
3️⃣ 緩存層的性能調優
緩存不僅可以提高應用性能,還可以通過合理配置優化應用的性能。例如,Redis支持分佈式鎖、異步加載等特性,可以根據業務需求靈活使用。
🤩 總結:緩存集成,提升性能的必備技能! ⚡
緩存是提升應用性能的關鍵技術,特別是在處理大量數據請求時,合理的緩存策略能夠顯著降低響應時間並提高系統的吞吐量。通過Spring Boot與Ehcache和Redis的完美集成,我們不僅可以在本地緩存中存儲數據,還可以利用Redis的分佈式特性來處理更大規模的數據。
通過Spring Boot提供的緩存抽象層,結合自定義緩存策略和緩存註解,我們能夠靈活控制緩存的行為,從而滿足不同場景下的性能需求。希望通過今天的學習,你能在自己的項目中靈活應用緩存技術,提高應用的性能和可擴展性!🚀
如果你在集成緩存或緩存優化過程中遇到問題,隨時向我提問!
🧧福利贈與你🧧
無論你是計算機專業的學生,還是對編程有興趣的小夥伴,都建議直接毫無顧忌的學習此專欄「滾雪球學SpringBoot」,bug菌鄭重承諾,凡是學習此專欄的同學,均能獲取到所需的知識和技能,全網最快速入門SpringBoot,就像滾雪球一樣,越滾越大, 無邊無際,指數級提升。
最後,如果這篇文章對你有所幫助,幫忙給作者來個一鍵三連,關注、點贊、收藏,您的支持就是我堅持寫作最大的動力。
同時歡迎大家關注公眾號:[「猿圈奇妙屋」],以便學習更多同類型的技術文章,免費白嫖最新BAT互聯網公司面試題、4000G pdf電子書籍、簡歷模板、技術文章Markdown文檔等海量資料。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 華為雲 | 阿里雲 | 騰訊雲 等社區博客專家,C站博客之星Top30,華為雲2023年度十佳博主,掘金多年度人氣作者Top40,掘金等各大社區平台簽約作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社區優質創作者;全網粉絲合計 30w+;更多精彩福利點擊[這裏];硬核微信公眾號[「猿圈奇妙屋」],歡迎你的加入!免費白嫖最新BAT互聯網公司面試真題、4000G PDF電子書籍、簡歷模板等海量資料,你想要的我都有,關鍵是你不來拿。
<div align="center"><img width="780" height="" src="https://i-blog.csdnimg.cn/direct/f7f3d1c620174b5ebd4d74b7255a33ad.png"/></div>
-End-