Spring?Boot?緩存?與?Redis問題小結
緩存是提升接口響應速度和降低數(shù)據(jù)庫壓力的重要手段。
Redis | 通過Socket訪問到緩存服務,效率比EnCache低,對集群和分布式支持友好。 |
EnCache | 純Java的進程緩存,直接在JVM中進行緩存,速度快、效率高,但對分布式集群的支持不太好。 |
ConcurrentHashMap Manager | Spring Boot 默認提供的緩存管理器,線程安全,官方明確不建議在生產(chǎn)環(huán)境使用。 |
表 Java緩存方案對比
1 緩存注解
Spring Boot 提供了緩存抽象層,并結合JSR-107標準,提供了多個緩存注解。
@Cacheable | 查詢緩存。 |
@CachePut | 更新緩存。 |
@CacheEvict | 刪除緩存。 |
表 常用的緩存注解
這些注解作用于方法級別,在不侵入業(yè)務邏輯的前提下,實現(xiàn)緩存管理。它們是基于AOP實現(xiàn)的,有以下注意項:
- 只能用于public方法上。
- 只有當調(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 默認使用Lettuce作為Redis客戶端。
Lettuce | 基于Netty的異步非阻塞通信;原生線程安全;長連接Lettuce性能優(yōu)勢更明顯;CPU利用率更高效。 |
Jedis | 同步阻塞通信;非線程安全; |
表 Lettuce 與 Jedis對比
2.2 Redis 緩存問題
1 緩存穿透:查詢一個根本不存在的數(shù)據(jù),導致每次查詢都會訪問數(shù)據(jù)庫。
使用布隆過濾器(檢索元素是否存在集合中)。它內(nèi)存占用小。判斷元素存在有誤差,但是判斷元素不存在絕對準確。
2 緩存擊穿:某個熱點key突然實現(xiàn),大量請求同時訪問時,會擊穿緩存直接訪問數(shù)據(jù)庫。
使用互斥鎖或邏輯過期。也可以設置熱點key永不過期或是后臺刷新熱點key緩存。
3 緩存雪崩:大量緩存key同時失效,大量請求直接訪問數(shù)據(jù)庫。發(fā)生場景有:1)緩存服務器重啟;2)大量緩存設置相同過期時間。
緩存key的過期時間隨機化。
到此這篇關于Spring Boot 緩存 與 Redis的文章就介紹到這了,更多相關Spring Boot 緩存 Redis內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot使用Cache集成Redis做緩存的保姆級教程
- springboot使用redis緩存亂碼(key或者value亂碼)的解決
- SpringBoot中實現(xiàn)Redis緩存預熱
- SpringBoot整合Redis實現(xiàn)緩存分頁數(shù)據(jù)查詢功能
- Spring?Boot緩存實戰(zhàn)之Redis?設置有效時間和自動刷新緩存功能(時間支持在配置文件中配置)
- Spring?Boot實戰(zhàn)解決高并發(fā)數(shù)據(jù)入庫之?Redis?緩存+MySQL?批量入庫問題
- SpringBoot 開啟Redis緩存及使用方法
- 淺談Spring Boot中Redis緩存還能這么用
相關文章
無法啟動Redis打開redis-server閃退的問題解決辦法
正常開啟redis服務,首先要啟動redis-server.exe,但是閃退,導致無法開啟redis服務,這篇文章主要給大家介紹了關于無法啟動Redis打開redis-server閃退問題的解決辦法,需要的朋友可以參考下2024-07-07Redis中統(tǒng)計各種數(shù)據(jù)大小的方法
這篇文章主要介紹了Redis中統(tǒng)計各種數(shù)據(jù)大小的方法,本文使用PHP實現(xiàn)統(tǒng)計Redis內(nèi)存占用比較大的鍵,需要的朋友可以參考下2015-03-03Redis實現(xiàn)數(shù)據(jù)的交集、并集、補集的示例
本文主要介紹了Redis實現(xiàn)數(shù)據(jù)的交集、并集、補集的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08解決redis-cli報錯Could not connect to Redis&
這篇文章主要介紹了解決redis-cli報錯Could not connect to Redis at 127.0.0.1:6379: Connection refused,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04