欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Boot?緩存?與?Redis問(wèn)題小結(jié)

 更新時(shí)間:2025年07月21日 09:56:30   作者:黃名富  
本文總結(jié)SpringBoot緩存方案,對(duì)比Redis與EnCache優(yōu)劣,指出Redis支持集群但效率較低,EnCache速度快但不支持分布式,SpringBoot默認(rèn)使用ConcurrentHashMapManager,本文給大家介紹Spring?Boot緩存與Redis問(wèn)題小結(jié),感興趣的朋友一起看看吧

緩存是提升接口響應(yīng)速度和降低數(shù)據(jù)庫(kù)壓力的重要手段。

Redis

通過(guò)Socket訪問(wèn)到緩存服務(wù),效率比EnCache低,對(duì)集群和分布式支持友好。

EnCache

純Java的進(jìn)程緩存,直接在JVM中進(jìn)行緩存,速度快、效率高,但對(duì)分布式集群的支持不太好。

ConcurrentHashMap

Manager

Spring Boot 默認(rèn)提供的緩存管理器,線程安全,官方明確不建議在生產(chǎn)環(huán)境使用。

表 Java緩存方案對(duì)比

1 緩存注解

Spring Boot 提供了緩存抽象層,并結(jié)合JSR-107標(biāo)準(zhǔn),提供了多個(gè)緩存注解。

@Cacheable

查詢緩存。

@CachePut

更新緩存。

@CacheEvict

刪除緩存。

表 常用的緩存注解

這些注解作用于方法級(jí)別,在不侵入業(yè)務(wù)邏輯的前提下,實(shí)現(xiàn)緩存管理。它們是基于AOP實(shí)現(xiàn)的,有以下注意項(xiàng):

  1. 只能用于public方法上。
  2. 只有當(dāng)調(diào)用方通過(guò)Spring代理調(diào)用該方法時(shí)才生效。(同一個(gè)類中直接調(diào)用不生效)
  3. 需要啟用緩存功能。@EnableCaching。

1.1 緩存key 生成策略

緩存注解keyGenerator字段用于指定該方法緩存key的生成策略。

圖 key 生成策略需實(shí)現(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的異步非阻塞通信;原生線程安全;長(zhǎng)連接Lettuce性能優(yōu)勢(shì)更明顯;CPU利用率更高效。

Jedis

同步阻塞通信;非線程安全;

表 Lettuce 與 Jedis對(duì)比

2.2 Redis 緩存問(wèn)題

1 緩存穿透:查詢一個(gè)根本不存在的數(shù)據(jù),導(dǎo)致每次查詢都會(huì)訪問(wèn)數(shù)據(jù)庫(kù)。

使用布隆過(guò)濾器(檢索元素是否存在集合中)。它內(nèi)存占用小。判斷元素存在有誤差,但是判斷元素不存在絕對(duì)準(zhǔn)確。

2 緩存擊穿:某個(gè)熱點(diǎn)key突然實(shí)現(xiàn),大量請(qǐng)求同時(shí)訪問(wèn)時(shí),會(huì)擊穿緩存直接訪問(wèn)數(shù)據(jù)庫(kù)。

使用互斥鎖或邏輯過(guò)期。也可以設(shè)置熱點(diǎn)key永不過(guò)期或是后臺(tái)刷新熱點(diǎn)key緩存。

3 緩存雪崩:大量緩存key同時(shí)失效,大量請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù)。發(fā)生場(chǎng)景有:1)緩存服務(wù)器重啟;2)大量緩存設(shè)置相同過(guò)期時(shí)間。

緩存key的過(guò)期時(shí)間隨機(jī)化。

到此這篇關(guān)于Spring Boot 緩存 與 Redis的文章就介紹到這了,更多相關(guān)Spring Boot 緩存 Redis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis大key多key拆分實(shí)現(xiàn)方法解析

    Redis大key多key拆分實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Redis大key多key拆分實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 無(wú)法啟動(dòng)Redis打開(kāi)redis-server閃退的問(wèn)題解決辦法

    無(wú)法啟動(dòng)Redis打開(kāi)redis-server閃退的問(wèn)題解決辦法

    正常開(kāi)啟redis服務(wù),首先要啟動(dòng)redis-server.exe,但是閃退,導(dǎo)致無(wú)法開(kāi)啟redis服務(wù),這篇文章主要給大家介紹了關(guān)于無(wú)法啟動(dòng)Redis打開(kāi)redis-server閃退問(wèn)題的解決辦法,需要的朋友可以參考下
    2024-07-07
  • Redis分片集群的實(shí)現(xiàn)

    Redis分片集群的實(shí)現(xiàn)

    Redis 分片集群是一種將 Redis數(shù)據(jù)庫(kù)分散到多個(gè)節(jié)點(diǎn)上的方式,以提供更高的性能和可伸縮性,本文主要介紹了Redis分片集群的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • 淺談redission鎖的默認(rèn)失效時(shí)間

    淺談redission鎖的默認(rèn)失效時(shí)間

    Redisson是一個(gè)基于Redis的Java駐留庫(kù),提供了許多分布式對(duì)象和服務(wù),包括分布式鎖,本文主要介紹了淺談redission鎖的默認(rèn)失效時(shí)間, 具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Redis分布式鎖解決秒殺超賣問(wèn)題

    Redis分布式鎖解決秒殺超賣問(wèn)題

    本文主要介紹了Redis分布式鎖解決秒殺超賣問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis中統(tǒng)計(jì)各種數(shù)據(jù)大小的方法

    Redis中統(tǒng)計(jì)各種數(shù)據(jù)大小的方法

    這篇文章主要介紹了Redis中統(tǒng)計(jì)各種數(shù)據(jù)大小的方法,本文使用PHP實(shí)現(xiàn)統(tǒng)計(jì)Redis內(nèi)存占用比較大的鍵,需要的朋友可以參考下
    2015-03-03
  • Redis實(shí)現(xiàn)數(shù)據(jù)的交集、并集、補(bǔ)集的示例

    Redis實(shí)現(xiàn)數(shù)據(jù)的交集、并集、補(bǔ)集的示例

    本文主要介紹了Redis實(shí)現(xiàn)數(shù)據(jù)的交集、并集、補(bǔ)集的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 解決redis-cli報(bào)錯(cuò)Could not connect to Redis at 127.0.0.1:6379: Connection refused

    解決redis-cli報(bào)錯(cuò)Could not connect to Redis&

    這篇文章主要介紹了解決redis-cli報(bào)錯(cuò)Could not connect to Redis at 127.0.0.1:6379: Connection refused,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 一文詳解Redis為什么一定要設(shè)置密碼原理

    一文詳解Redis為什么一定要設(shè)置密碼原理

    這篇文章主要為大家介紹了Redis為什么一定要設(shè)置密碼原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解Redis中的雙鏈表結(jié)構(gòu)

    詳解Redis中的雙鏈表結(jié)構(gòu)

    這篇文章主要介紹了Redis中的雙鏈表結(jié)構(gòu),包括listNode結(jié)構(gòu)的API,需要的朋友可以參考下
    2015-08-08

最新評(píng)論