SpringCache的簡(jiǎn)介和使用教程
1、簡(jiǎn)介
Spring 從 3.1 開始定義了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口來統(tǒng)一不同的緩存技術(shù);
并支持使用 JCache(JSR-107)注解簡(jiǎn)化我們開發(fā)
Cache 接口為緩存的組件規(guī)范定義,包含緩存的各種操作集合; Cache 接 口 下 Spring 提 供 了 各 種 xxxCache 的 實(shí) 現(xiàn) ; 如 RedisCache ,
EhCacheCache , ConcurrentMapCache 等;
每次調(diào)用需要緩存功能的方法時(shí),Spring 會(huì)檢查檢查指定參數(shù)的指定的目標(biāo)方法是否已經(jīng)被調(diào)用過;如果有就直接從緩存中獲取方法
調(diào)用后的結(jié)果,如果沒有就調(diào)用方法并緩存結(jié)果后返回給用戶。下次調(diào)用直接從緩存中獲取
2、整合SpringCache簡(jiǎn)化緩存開發(fā)
1)引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
2)添加配置
spring.cache.type=redis
3)測(cè)試使用緩存
@Cacheable 觸發(fā)將數(shù)據(jù)保存到緩存的操作 @CacheEvict 將數(shù)據(jù)從緩存刪除 @CachePut 不影響方法執(zhí)行 更新緩存 @Caching 組合以上多個(gè)操作 @CacheConfig 在類級(jí)別,共享緩存的相同配置
①、主啟動(dòng)類上添加 @EnableCache注解,開啟緩存功能
②、只需要使用注解就可以完成緩存操作
當(dāng)方法的結(jié)果需要緩存到數(shù)據(jù)庫,在方法上加上 @CacheEnable注解
/* 1、每一個(gè)需要緩存的數(shù)據(jù),我們都要來指定要放到哪個(gè)名字的緩存?!鞠喈?dāng)于緩存的分區(qū)(按照業(yè)務(wù)類型來進(jìn)行分區(qū))】 2、代表當(dāng)前方法的結(jié)果需要緩存,如果緩存中有,方法不調(diào)用;如果緩存中沒有,會(huì)調(diào)用方法,并將方法返回的結(jié)果放入緩存 3、默認(rèn)行為 1)如果緩存中有,方法不能調(diào)用 2)key值默認(rèn)生成,緩存的名字::simplekey [] 3)緩存的value的值默認(rèn)使用jdk序列化機(jī)制,將序列化后的數(shù)據(jù)存儲(chǔ)到redis 4)默認(rèn)緩存過期時(shí)間是-1(用戶過期) 自定義: 1)指定緩存生成的key: 指定key-> spel表達(dá)式 2)指定緩存的數(shù)據(jù)的過期時(shí)間:配置文件指定 3)將數(shù)據(jù)保存為json格式: */ @Cacheable("category") @Override public List<CategoryEntity> getLevel1Categorys() { System.out.println("getLevel1Categorys方法執(zhí)行......"); List<CategoryEntity> categoryEntities = this.baseMapper .selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", "0")); return categoryEntities; }
第一次訪問該方法時(shí),需要訪問數(shù)據(jù)庫;第二次訪問該方法時(shí),則直接從緩存中獲取
③、以自定義的方式設(shè)置key的名稱和過期時(shí)間
@Cacheable(value = {"category"},key="'level1Categorys'")
配置文件中添加
#以毫秒為單位 spring.cache.redis.time-to-live=3600000
④、更多自定義配置
配置key,value的序列化機(jī)制:
/** * @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 (去除緩存)
指定刪除某個(gè)分區(qū)下的所有數(shù)據(jù)
@CacheEvict(value="category",allEntries=true)
約定:
同一個(gè)類型的數(shù)據(jù),可以緩存在相同名稱的分區(qū)中!
3、SpringCache的原理和不足
1)讀模式
緩存穿透:查詢一個(gè)null數(shù)據(jù)。解決:緩存空數(shù)據(jù):cache-null-values=true
緩存擊穿:大量并發(fā)請(qǐng)求進(jìn)來同時(shí)查詢一個(gè)正好過期的數(shù)據(jù)。 解決: 加鎖
緩存雪崩:大量的key同時(shí)過期 解決:加隨機(jī)時(shí)間
2)寫模式 (如何保證緩存和數(shù)據(jù)庫一致性)
1)加鎖模式
2)引入canal
3)讀多寫多,直接去數(shù)據(jù)庫查詢
到此這篇關(guān)于SpringCache的簡(jiǎn)介和使用教程的文章就介紹到這了,更多相關(guān)SpringCache使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java仿Servlet生成驗(yàn)證碼實(shí)例詳解
這篇文章主要介紹了java仿Servlet生成驗(yàn)證碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04使用@DS輕松解決動(dòng)態(tài)數(shù)據(jù)源的問題
這篇文章主要介紹了使用@DS輕松解決動(dòng)態(tài)數(shù)據(jù)源的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05springboot2.1.7整合thymeleaf代碼實(shí)例
這篇文章主要介紹了springboot2.1.7整合thymeleaf代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java實(shí)現(xiàn)簡(jiǎn)易的洗牌和發(fā)牌功能
本文主要介紹了Java實(shí)現(xiàn)簡(jiǎn)易的洗牌和發(fā)牌功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java多線程之并發(fā)編程的基石CAS機(jī)制詳解
這篇文章主要介紹了java并發(fā)編程之cas詳解,涉及cas使用場(chǎng)景和cas用作原子操作等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下2021-09-09