SpringCache的簡介和使用


1、簡介

Spring 從 3.1 開始定義了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口來統一不同的緩存技術;

並支持使用 JCache(JSR-107)注解簡化我們開發

 

Cache 接口為緩存的組件規范定義,包含緩存的各種操作集合; Cache 接 口 下 Spring 提 供 了 各 種 xxxCache 的 實 現 ; 如 RedisCache ,

EhCacheCache , ConcurrentMapCache 等;

 

每次調用需要緩存功能的方法時,Spring 會檢查檢查指定參數的指定的目標方法是否已經被調用過;如果有就直接從緩存中獲取方法

調用后的結果,如果沒有就調用方法並緩存結果后返回給用戶。下次調用直接從緩存中獲取

 

2、整合SpringCache簡化緩存開發

1)引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

 

2)添加配置

spring.cache.type=redis

 

3)測試使用緩存

@Cacheable   觸發將數據保存到緩存的操作
@CacheEvict  將數據從緩存刪除
@CachePut    不影響方法執行 更新緩存
@Caching     組合以上多個操作
@CacheConfig 在類級別,共享緩存的相同配置

 

①、主啟動類上添加 @EnableCache注解,開啟緩存功能

 

②、只需要使用注解就可以完成緩存操作

當方法的結果需要緩存到數據庫,在方法上加上 @CacheEnable注解

/*
1、每一個需要緩存的數據,我們都要來指定要放到哪個名字的緩存。【相當於緩存的分區(按照業務類型來進行分區)】
2、代表當前方法的結果需要緩存,如果緩存中有,方法不調用;如果緩存中沒有,會調用方法,並將方法返回的結果放入緩存
3、默認行為
    1)如果緩存中有,方法不能調用
    2)key值默認生成,緩存的名字::simplekey []
    3)緩存的value的值默認使用jdk序列化機制,將序列化后的數據存儲到redis
    4)默認緩存過期時間是-1(用戶過期)

    自定義:
    1)指定緩存生成的key: 指定key-> spel表達式
    2)指定緩存的數據的過期時間:配置文件指定
    3)將數據保存為json格式:

*/
@Cacheable("category")
@Override
public List<CategoryEntity> getLevel1Categorys() {
    System.out.println("getLevel1Categorys方法執行......");
    List<CategoryEntity> categoryEntities = this.baseMapper
        .selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", "0"));
    return categoryEntities;
}

第一次訪問該方法時,需要訪問數據庫;第二次訪問該方法時,則直接從緩存中獲取

 

③、以自定義的方式設置key的名稱和過期時間

@Cacheable(value = {"category"},key="'level1Categorys'")

 

配置文件中添加

#以毫秒為單位
spring.cache.redis.time-to-live=3600000

0

 

④、更多自定義配置

配置key,value的序列化機制:

/**
 * @author houChen
 * @date 2021/11/4 6:59
 * @Description:
 *
 * 緩存配置類
 *    @ConfigurationProperties(prefix = "spring.cache") : 只是使類中的屬性和配置文件綁定,並不能注入到容器中
 *
 */
@EnableConfigurationProperties(CacheProperties.class)    //@EnableConfigurationProperties注解 可以使CacheProperties類注入到容器中
@Configuration
@EnableCaching
public class MyCacheConfig {

    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        config=config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config=config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        CacheProperties.Redis redisCacheProperties = cacheProperties.getRedis();
        if(redisCacheProperties.getTimeToLive()!=null){
            config = config.entryTtl(redisCacheProperties.getTimeToLive());
        }
        return config;
    }
}

 

⑤、使用@CacheEvict (去除緩存)

指定刪除某個分區下的所有數據

@CacheEvict(value="category",allEntries=true)
 
        

約定:

同一個類型的數據,可以緩存在相同名稱的分區中!

 

3、SpringCache的原理和不足

1)讀模式

緩存穿透:查詢一個null數據。解決:緩存空數據:cache-null-values=true

緩存擊穿:大量並發請求進來同時查詢一個正好過期的數據。 解決: 加鎖

緩存雪崩:大量的key同時過期 解決:加隨機時間

 

2)寫模式 (如何保證緩存和數據庫一致性)

1)加鎖模式

2)引入canal

 

3)讀多寫多,直接去數據庫查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM