Spring?Boot?緩存?與?Redis問題小結(jié)
緩存是提升接口響應(yīng)速度和降低數(shù)據(jù)庫壓力的重要手段。
Redis | 通過Socket訪問到緩存服務(wù),效率比EnCache低,對集群和分布式支持友好。 |
EnCache | 純Java的進(jìn)程緩存,直接在JVM中進(jìn)行緩存,速度快、效率高,但對分布式集群的支持不太好。 |
ConcurrentHashMap Manager | Spring Boot 默認(rèn)提供的緩存管理器,線程安全,官方明確不建議在生產(chǎn)環(huán)境使用。 |
表 Java緩存方案對比
1 緩存注解
Spring Boot 提供了緩存抽象層,并結(jié)合JSR-107標(biāo)準(zhǔn),提供了多個緩存注解。
@Cacheable | 查詢緩存。 |
@CachePut | 更新緩存。 |
@CacheEvict | 刪除緩存。 |
表 常用的緩存注解
這些注解作用于方法級別,在不侵入業(yè)務(wù)邏輯的前提下,實現(xiàn)緩存管理。它們是基于AOP實現(xiàn)的,有以下注意項:
- 只能用于public方法上。
- 只有當(dāng)調(diào)用方通過Spring代理調(diào)用該方法時才生效。(同一個類中直接調(diào)用不生效)
- 需要啟用緩存功能。@EnableCaching。
1.1 緩存key 生成策略
緩存注解keyGenerator字段用于指定該方法緩存key的生成策略。

圖 key 生成策略需實現(xiàn)的接口
@Bean
public KeyGenerator paramsKeyGenerator() {
return ((target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getSimpleName());
sb.append("::");
sb.append(method.getName());
for (Object obj : params) {
sb.append("::");
sb.append(obj.toString());
}
return sb.toString();
});
}2 Redis 緩存策略
maven依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>緩存策略配置:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30))
.disableCachingNullValues() // 避免緩存穿透
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}2.1 redis 連接池
Spring Boot 2.x 默認(rèn)使用Lettuce作為Redis客戶端。
Lettuce | 基于Netty的異步非阻塞通信;原生線程安全;長連接Lettuce性能優(yōu)勢更明顯;CPU利用率更高效。 |
Jedis | 同步阻塞通信;非線程安全; |
表 Lettuce 與 Jedis對比
2.2 Redis 緩存問題
1 緩存穿透:查詢一個根本不存在的數(shù)據(jù),導(dǎo)致每次查詢都會訪問數(shù)據(jù)庫。
使用布隆過濾器(檢索元素是否存在集合中)。它內(nèi)存占用小。判斷元素存在有誤差,但是判斷元素不存在絕對準(zhǔn)確。
2 緩存擊穿:某個熱點key突然實現(xiàn),大量請求同時訪問時,會擊穿緩存直接訪問數(shù)據(jù)庫。
使用互斥鎖或邏輯過期。也可以設(shè)置熱點key永不過期或是后臺刷新熱點key緩存。
3 緩存雪崩:大量緩存key同時失效,大量請求直接訪問數(shù)據(jù)庫。發(fā)生場景有:1)緩存服務(wù)器重啟;2)大量緩存設(shè)置相同過期時間。
緩存key的過期時間隨機化。
到此這篇關(guān)于Spring Boot 緩存 與 Redis的文章就介紹到這了,更多相關(guān)Spring Boot 緩存 Redis內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用Cache集成Redis做緩存的保姆級教程
- springboot使用redis緩存亂碼(key或者value亂碼)的解決
- SpringBoot中實現(xiàn)Redis緩存預(yù)熱
- SpringBoot整合Redis實現(xiàn)緩存分頁數(shù)據(jù)查詢功能
- Spring?Boot緩存實戰(zhàn)之Redis?設(shè)置有效時間和自動刷新緩存功能(時間支持在配置文件中配置)
- Spring?Boot實戰(zhàn)解決高并發(fā)數(shù)據(jù)入庫之?Redis?緩存+MySQL?批量入庫問題
- SpringBoot 開啟Redis緩存及使用方法
- 淺談Spring Boot中Redis緩存還能這么用
相關(guān)文章
解決redis錯誤消息:BUSYKEY Target key name alre
這篇文章主要介紹了解決redis錯誤消息:BUSYKEY Target key name already exists.問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
redis中5種數(shù)據(jù)基礎(chǔ)查詢命令
本文主要介紹了redis中5種數(shù)據(jù)基礎(chǔ)查詢命令,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題?
大key并不是指key的值很大,而是key對應(yīng)的value很大,下面這篇文章主要給大家介紹了Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題的相關(guān)資料,需要的朋友可以參考下2023-03-03
基于Redis實現(xiàn)短信驗證碼登錄項目示例(附源碼)
手機登錄驗證在很多網(wǎng)頁上都得到使用,本文主要介紹了基于Redis實現(xiàn)短信驗證碼登錄項目示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

