SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine)
1. 緩存、兩級(jí)緩存
1.1 內(nèi)容說(shuō)明
Spring cache:主要包含spring cache定義的接口方法說(shuō)明和注解中的屬性說(shuō)明
springboot+spring cache:rediscache實(shí)現(xiàn)中的缺陷
caffeine簡(jiǎn)介
spring boot+spring cache實(shí)現(xiàn)兩級(jí)緩存
使用緩存時(shí)的流程圖

1.2 Sping Cache
spring cache是spring-context包中提供的基于注解方式使用的緩存組件,定義了一些標(biāo)準(zhǔn)接口,通過(guò)實(shí)現(xiàn)這些接口,就可以通過(guò)在方法上增加注解來(lái)實(shí)現(xiàn)緩存。這樣就能夠避免緩存代碼與業(yè)務(wù)處理耦合在一起的問(wèn)題。spring cache的實(shí)現(xiàn)是使用spring aop中對(duì)方法切面(MethodInterceptor)封裝的擴(kuò)展,當(dāng)然spring aop也是基于Aspect來(lái)實(shí)現(xiàn)的。
spring cache核心的接口就兩個(gè):Cache和CacheManager
1.2.1 Cache接口
提供緩存的具體操作,比如緩存的放入,讀取,清理,spring框架中默認(rèn)提供的實(shí)現(xiàn)有

1.2.2 CacheManager接口
主要提供Cache實(shí)現(xiàn)bean的創(chuàng)建,每個(gè)應(yīng)用里可以通過(guò)cacheName來(lái)對(duì)Cache進(jìn)行隔離,每個(gè)CaheName對(duì)應(yīng)一個(gè)Cache實(shí)現(xiàn),spring框架中默認(rèn)提供的實(shí)現(xiàn)與Cache的實(shí)現(xiàn)都是成對(duì)出現(xiàn)的
1.2.3 常用的注解說(shuō)明
- @Cacheable:主要應(yīng)用到查詢(xún)數(shù)據(jù)的方法上
- @CacheEvict:清除緩存,主要應(yīng)用到刪除數(shù)據(jù)的方法上
- @CachePut:放入緩存,主要用到對(duì)數(shù)據(jù)有更新的方法上
- @Caching:用于在一個(gè)方法上配置多種注解
- @EnableCaching:?jiǎn)⒂胹pring cache緩存,作為總的開(kāi)關(guān),在spring boot的啟動(dòng)類(lèi)或配置類(lèi)上需要加入次注解才會(huì)生效
2.實(shí)戰(zhàn)多級(jí)緩存的用法
package com.xfgg.demo.config;
import lombok.AllArgsConstructor;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
@AllArgsConstructor
//把定義的緩存加入到Caffeine中
public class CacheConfig {
@Bean
public CacheManager cacheManager(){
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
//使用refreshAfterWrite必須要設(shè)置cacheLoader
//在5分鐘內(nèi)沒(méi)有創(chuàng)建/覆蓋時(shí),會(huì)移除該key,下次取的時(shí)候從loading中取【重點(diǎn):失效、移除Key、失效后需要獲取新值】
.expireAfterWrite(5, TimeUnit.MINUTES)
//初始容量
.initialCapacity(10)
//用來(lái)控制cache的最大緩存數(shù)量
.maximumSize(150)
);
return cacheManager;
}
}
package com.xfgg.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
//生成的redis連接
public class RedisConfig<GenericObjectPoolConfig> {
@Value("${spring.redis1.host}")
private String host;
@Value("${spring.redis1.port}")
private Integer port;
@Value("${spring.redis1.password}")
private String password;
@Value("${spring.redis1.database}")
private Integer database;
@Value("${spring.redis1.lettuce.pool.max-active}")
private Integer maxActive;
@Value("${spring.redis1.lettuce.pool.max-idle}")
private Integer maxIdle;
@Value("${spring.redis1.lettuce.pool.max-wait}")
private Long maxWait;
@Value("${spring.redis1.lettuce.pool.min-idle}")
private Integer minIdle;
@Bean
public RedisStandaloneConfiguration redis1RedisConfig() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPassword(RedisPassword.of(password));
config.setPort(port);
config.setDatabase(database);
return config;
}
//配置序列化器
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object>template=new RedisTemplate<>();
//關(guān)聯(lián)
template.setConnectionFactory(factory);
//設(shè)置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//設(shè)置value的序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
一個(gè)使用cacheable注解,一個(gè)使用redistemplate進(jìn)行緩存
因?yàn)楣卷?xiàng)目中用到的是jedis和jediscluster所以這里只是做個(gè)了解,沒(méi)有寫(xiě)的很細(xì)
到此這篇關(guān)于SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine)的文章就介紹到這了,更多相關(guān)SpringBoot SpringCache兩級(jí)緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springBoot?啟動(dòng)指定配置文件環(huán)境多種方案(最新推薦)
springBoot?啟動(dòng)指定配置文件環(huán)境理論上是有多種方案的,一般都是結(jié)合我們的實(shí)際業(yè)務(wù)選擇不同的方案,比如,有pom.xml文件指定、maven命令行指定、配置文件指定、啟動(dòng)jar包時(shí)指定等方案,今天我們一一分享一下,需要的朋友可以參考下2023-09-09
Spring Cloud Config實(shí)現(xiàn)分布式配置中心
這篇文章主要介紹了Spring Cloud Config實(shí)現(xiàn)分布式配置中心,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
JAVA WEB中Servlet和Servlet容器的區(qū)別
這篇文章主要介紹了JAVA WEB中Servlet和Servlet容器的區(qū)別,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
JavaWeb三大組件之監(jiān)聽(tīng)器Listener詳解
這篇文章主要介紹了JavaWeb三大組件之監(jiān)聽(tīng)器Listener詳解,在JavaWeb應(yīng)用程序中,Listener監(jiān)聽(tīng)器是一種機(jī)制,用于監(jiān)聽(tīng)和響應(yīng)特定的事件,它可以感知并響應(yīng)與應(yīng)用程序相關(guān)的事件,從而執(zhí)行相應(yīng)的邏輯處理,需要的朋友可以參考下2023-10-10
Java基礎(chǔ)強(qiáng)化訓(xùn)練輸入錯(cuò)誤即結(jié)束進(jìn)程
本文主要介紹了Java編程的基礎(chǔ)知識(shí)強(qiáng)化應(yīng)用,文中實(shí)例涉及到了許多基礎(chǔ)知識(shí),new對(duì)象,控制臺(tái)輸入,if語(yǔ)句等。很實(shí)用,需要的朋友可以參考下2017-09-09
基于java HashMap插入重復(fù)Key值問(wèn)題
這篇文章主要介紹了基于java HashMap插入重復(fù)Key值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java的super關(guān)鍵字與instanceof運(yùn)算符使用方法
這篇文章主要介紹了Java的super關(guān)鍵字與instanceof運(yùn)算符使用方法,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
Java運(yùn)算符的知識(shí)點(diǎn)與代碼匯總
這篇文章主要給大家總結(jié)介紹了關(guān)于Java運(yùn)算符知識(shí)點(diǎn)與代碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

