🏆本文收錄於「滾雪球學SpringBoot」專欄,手把手帶你零基礎入門springboot,從入門到就業,助你早日登頂實現財富自由🚀;同時,歡迎大家關注&&收藏&&訂閲!持續更新中,up!up!up!!

環境説明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 

🚀 前言 🔥

  在現代應用中,緩存已成為提高應用性能的關鍵技術。特別是在處理大量併發請求和頻繁訪問數據時,緩存能夠大幅度提升系統的響應速度與可擴展性。Spring Boot作為一個開箱即用的框架,提供了極為便捷的緩存集成功能。在眾多緩存實現中,Ehcache作為本地緩存和Redis作為分佈式緩存,在Spring Boot中被廣泛使用。今天,我們將詳細探討如何在Spring Boot項目中集成EhcacheRedis,並介紹緩存策略和如何自定義緩存策略,以進一步提升系統性能。

目錄 📚

  • 🌟 緩存概述與常見策略
  • 🧩 Spring Boot 緩存抽象層
  • 🛠️ 使用Ehcache作為本地緩存
  • 🔥 集成Redis緩存
  • 🔧 自定義緩存策略與註解使用

🌟 緩存概述與常見策略 🧠

  緩存是存儲數據副本的機制,旨在減少從遠程數據源(如數據庫或外部API)獲取數據的頻率,從而減少延遲並提高應用的響應速度。通過緩存技術,我們可以把訪問頻繁的數據存儲在內存中,避免每次都進行昂貴的計算或I/O操作。

常見緩存策略

  1. **LRU(Least Recently Used,最近最少使用)**:

    • 這是最常見的緩存替換策略,當緩存滿時,LRU會刪除最近最少被訪問的緩存數據。非常適用於需要存儲有限數據量的場景。
  2. **LFU(Least Frequently Used,最不常使用)**:

    • LFU策略會刪除訪問次數最少的數據。這對於那些訪問頻率差異較大的數據訪問場景非常有效。
  3. **TTL(Time-to-Live,生存時間)**:

    • TTL策略會給緩存的數據設置一個過期時間,超過這個時間後數據會被自動刪除。適合於需要定期更新的數據。
  4. **寫時緩存(Write-through Cache)**:

    • 當寫入數據時,首先寫入緩存,再寫入數據庫。這種策略適合數據一致性要求較高的場景。
  5. **異步寫緩存(Write-back Cache)**:

    • 數據首先寫入緩存,數據庫的寫操作被延遲,緩存會定期將數據寫入數據庫。這有助於減少對數據庫的訪問量,但會增加數據一致性的挑戰。

  常見的緩存策略幫助我們根據具體的應用場景選擇合適的策略。在Spring Boot項目中,我們可以通過緩存註解靈活配置緩存行為,並通過集成像EhcacheRedis這樣的緩存框架來優化應用的性能。

🧩 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.propertiesapplication.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與EhcacheRedis的完美集成,我們不僅可以在本地緩存中存儲數據,還可以利用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-