SpringBoot實現(xiàn)Read Through模式的操作過程
簡介
Read Through模式通常是指一種緩存策略,其中當(dāng)應(yīng)用程序嘗試讀取數(shù)據(jù)時,緩存系統(tǒng)首先被檢查以查看數(shù)據(jù)是否已經(jīng)存在于緩存中。如果緩存中存在數(shù)據(jù)(即緩存命中),則直接從緩存中讀取數(shù)據(jù)并返回給應(yīng)用程序。如果緩存中不存在數(shù)據(jù)(即緩存未命中),則從底層的數(shù)據(jù)存儲(如數(shù)據(jù)庫)中讀取數(shù)據(jù),然后將數(shù)據(jù)加載到緩存中,最后再返回給應(yīng)用程序。
這種模式的主要優(yōu)點包括:
- 提高性能:通過減少對底層存儲的直接訪問次數(shù),可以顯著提高數(shù)據(jù)檢索的性能。
- 減少延遲:緩存通常位于內(nèi)存中,訪問速度比磁盤存儲快得多,因此可以減少數(shù)據(jù)檢索的延遲。
- 減輕數(shù)據(jù)庫負(fù)載:通過在緩存中存儲頻繁訪問的數(shù)據(jù),可以減少對數(shù)據(jù)庫的查詢壓力,從而提高整個系統(tǒng)的吞吐量。
Read Through模式通常與Lazy Loading(懶加載)和Eager Loading(急加載)等策略相對比:
- Lazy Loading:數(shù)據(jù)僅在需要時才加載,這可以減少不必要的數(shù)據(jù)加載,但可能會增加首次訪問的延遲。
- Eager Loading:預(yù)先加載數(shù)據(jù),這可以減少首次訪問的延遲,但可能會增加應(yīng)用程序的內(nèi)存使用和啟動時間。
在實現(xiàn)Read Through模式時,可能需要考慮以下方面:
- 緩存失效策略:確定何時從緩存中移除數(shù)據(jù),例如基于時間(TTL)或基于空間(當(dāng)緩存達(dá)到一定大小時)。
- 并發(fā)控制:處理多個應(yīng)用程序?qū)嵗瑫r訪問和修改緩存的情況。
- 數(shù)據(jù)一致性:確保緩存中的數(shù)據(jù)與底層存儲中的數(shù)據(jù)保持一致,特別是在數(shù)據(jù)更新時。
實現(xiàn)
在Spring Boot中實現(xiàn)Read Through模式,通常可以通過Spring Cache抽象來完成。Spring Cache提供了一個跨不同緩存實現(xiàn)的統(tǒng)一API,并且支持多種緩存解決方案,如EhCache、Hazelcast、Infinispan、Redis等。
添加依賴:首先,需要添加Spring Boot的緩存依賴和選擇的緩存實現(xiàn)庫(如Redis)
<!-- Spring Boot Starter Cache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- 以Redis為例,添加Redis的Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
啟用緩存注解:在Spring Boot的配置類上添加@EnableCaching
注解,以啟用緩存注解支持。
配置緩存管理器:配置一個或多個CacheManager
,Spring Boot會自動配置一個簡單的CacheManager
,但你可以根據(jù)需要配置更復(fù)雜的緩存策略。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; @Configuration public class RedisCacheConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(GenericJackson2JsonRedisSerializer.json()))) Map<String, RedisCacheConfiguration> customCacheConfigs = new HashMap<>(); customCacheConfigs.put("mySpecialCache", config.entryTtl(Duration.ofMinutes(15))); // 為特定緩存設(shè)置不同的過期時間 .disableCachingNullValues(); return RedisCacheManager.builder(connectionFactory) .cacheDefaults(config) // 在這里可以自定義添加緩存配置 .withInitialCacheConfigurations(customCacheConfigs) .build(); } }
使用緩存注解:在需要緩存的方法上使用@Cacheable
注解來實現(xiàn)Read Through模式。如果緩存中沒有數(shù)據(jù),方法將被調(diào)用,結(jié)果將被緩存。
import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class MyService { @Cacheable(value = "myCache", key = "#id") public MyData getDataById(String id) { // 從數(shù)據(jù)庫加載數(shù)據(jù) return myDataRepository.findById(id); } }
緩存鍵值:在@Cacheable
注解中指定緩存的鍵值,這通常是基于方法參數(shù)的值。
緩存名稱:指定緩存名稱,這將用于區(qū)分不同的緩存域。
配置緩存參數(shù):可以根據(jù)需要配置緩存的超時時間、條件、除非條件等
value或cacheNames:指定緩存名稱。可以指定一個或多個緩存名稱,它們將用于存儲緩存。
@Cacheable(value = "myCacheName", key = "#id")
key:定義緩存鍵值的生成策略。通常使用SpEL表達(dá)式(Spring Expression Language)來指定方法參數(shù)作為緩存鍵。
@Cacheable(cacheNames = "myCache", key = "#id")
condition:定義緩存的條件,只有滿足條件時才進(jìn)行緩存。
@Cacheable(cacheNames = "myCache", key = "#id", condition = "#id.length() > 3")
unless:定義不進(jìn)行緩存的條件,與condition
相反,用于排除某些情況。
@Cacheable(cacheNames = "myCache", key = "#id", unless = "#result == null")
keyGenerator:指定自定義的緩存鍵生成策略,如果需要更復(fù)雜的鍵生成邏輯,可以指定一個KeyGenerator
的Bean名稱。
@Cacheable(cacheNames = "myCache", keyGenerator = "myKeyGenerator")
cacheManager:指定使用哪個CacheManager
,如果有多個CacheManager
時使用。
@Cacheable(cacheNames = "myCache", cacheManager = "myCacheManager")
expireAfterWrite:設(shè)置緩存項寫入后過期時間(單位為毫秒)。這是一種常用的配置,用于定義緩存數(shù)據(jù)的生存時間。
@Cacheable(cacheNames = "myCache", key = "#id", expireAfterWrite = 3600000) // 1小時后過期
expireAfterAccess:設(shè)置緩存項最后一次訪問后過期時間,適用于緩存數(shù)據(jù)在最后一次被訪問后多久過期。
refreshAfterWrite:設(shè)置寫入后多久刷新緩存,適用于動態(tài)刷新緩存的場景。
sync:設(shè)置是否同步創(chuàng)建緩存項,防止并發(fā)環(huán)境下的競態(tài)條件。
異常處理:確保處理緩存方法中可能拋出的異常,以避免影響應(yīng)用程序的穩(wěn)定性。
到此這篇關(guān)于SpringBoot實現(xiàn)Read Through模式的文章就介紹到這了,更多相關(guān)SpringBoot Read Through模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot使用ThreadPoolTaskExecutor多線程批量插入百萬級數(shù)據(jù)的實現(xiàn)方法
- SpringBoot ThreadLocal實現(xiàn)公共字段自動填充案例講解
- SpringBoot Test 多線程報錯的根本原因(dataSource already closed)
- SpringBoot通過ThreadLocal實現(xiàn)登錄攔截詳解流程
- springboot使用線程池(ThreadPoolTaskExecutor)示例
- IDEA2020.2創(chuàng)建springboot項目卡死在reading maven project的問題
相關(guān)文章
Java AQS中ReentrantReadWriteLock讀寫鎖的使用
ReentrantReadWriteLock稱為讀寫鎖,它提供一個讀鎖,支持多個線程共享同一把鎖。這篇文章主要講解一下ReentrantReadWriteLock的使用和應(yīng)用場景,感興趣的可以了解一下2023-02-02Java中增強for循環(huán)的實現(xiàn)原理和坑詳解
增強的for循環(huán)是在傳統(tǒng)的for循環(huán)中增加的強大的迭代功能的循環(huán),是在jdk1.5之后提出來的。下面這篇文章主要給大家介紹了關(guān)于Java中增強for循環(huán)的實現(xiàn)原理和坑的相關(guān)資料,需要的朋友可以參考下2018-04-04SpringBoot+actuator和admin-UI實現(xiàn)監(jiān)控中心方式
這篇文章主要介紹了SpringBoot+actuator和admin-UI實現(xiàn)監(jiān)控中心方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Java 實現(xiàn)實時監(jiān)聽文件夾是否有新文件增加并上傳服務(wù)器功能
本文中主要陳述一種實時監(jiān)聽文件夾中是否有文件增加的功能,可用于實際文件上傳功能的開發(fā)。本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧2019-09-09