SpringBoot+SpringCache實現兩級緩存(Redis+Caffeine)
1. 緩存、兩級緩存
1.1 內容說明
Spring cache:主要包含spring cache定義的接口方法說明和註解中的屬性說明
springboot+spring cache:rediscache實現中的缺陷
caffeine簡介
spring boot+spring cache實現兩級緩存
使用緩存時的流程圖
1.2 Sping Cache
spring cache是spring-context包中提供的基於註解方式使用的緩存組件,定義瞭一些標準接口,通過實現這些接口,就可以通過在方法上增加註解來實現緩存。這樣就能夠避免緩存代碼與業務處理耦合在一起的問題。spring cache的實現是使用spring aop中對方法切面(MethodInterceptor)封裝的擴展,當然spring aop也是基於Aspect來實現的。
spring cache核心的接口就兩個:Cache和CacheManager
1.2.1 Cache接口
提供緩存的具體操作,比如緩存的放入,讀取,清理,spring框架中默認提供的實現有
1.2.2 CacheManager接口
主要提供Cache實現bean的創建,每個應用裡可以通過cacheName來對Cache進行隔離,每個CaheName對應一個Cache實現,spring框架中默認提供的實現與Cache的實現都是成對出現的
1.2.3 常用的註解說明
- @Cacheable:主要應用到查詢數據的方法上
- @CacheEvict:清除緩存,主要應用到刪除數據的方法上
- @CachePut:放入緩存,主要用到對數據有更新的方法上
- @Caching:用於在一個方法上配置多種註解
- @EnableCaching:啟用spring cache緩存,作為總的開關,在spring boot的啟動類或配置類上需要加入次註解才會生效
2.實戰多級緩存的用法
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必須要設置cacheLoader //在5分鐘內沒有創建/覆蓋時,會移除該key,下次取的時候從loading中取【重點:失效、移除Key、失效後需要獲取新值】 .expireAfterWrite(5, TimeUnit.MINUTES) //初始容量 .initialCapacity(10) //用來控制cache的最大緩存數量 .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<>(); //關聯 template.setConnectionFactory(factory); //設置key的序列化器 template.setKeySerializer(new StringRedisSerializer()); //設置value的序列化器 template.setValueSerializer(new StringRedisSerializer()); return template; } }
一個使用cacheable註解,一個使用redistemplate進行緩存
因為公司項目中用到的是jedis和jediscluster所以這裡隻是做個瞭解,沒有寫的很細
到此這篇關於SpringBoot+SpringCache實現兩級緩存(Redis+Caffeine)的文章就介紹到這瞭,更多相關SpringBoot SpringCache兩級緩存內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 使用註解實現Redis緩存功能
- springboot redis使用lettuce配置多數據源的實現
- Java SpringCache+Redis緩存數據詳解
- Spring Boot 2.7.6整合redis與低版本的區別
- springboot2.5.0和redis整合配置詳解