SpringBoot註解使用redis做快取總結
文章目錄
前言
個人工作中對此相關內容的總結,部分資料來源於網上
一、@Cacheable、@CachePut、@CacheEvict 註釋介紹
@Cacheable
@Cacheable 的作用 主要針對方法配置,能夠根據方法的請求引數對其結果進行快取。
主要的引數 value快取的名稱,在 spring 配置檔案中定義,必須指定至少一個
引數 | 解釋 | example |
---|---|---|
value | 快取的名稱,在 spring 配置檔案中定義,必須指定至少一個 | 例如:@Cacheable(value=”mycache”) @Cacheable(value={”cache1”,”cache2”} |
key | 快取的 key,可以為空,如果指定要按照 SpEL 表示式編寫,如果不指定,則預設按照方法的所有引數進行組合 | @Cacheable(value=”testcache”,key=”#userName”) |
condition | 快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取 | @Cacheable(value=”testcache”,condition=”#userName.length()>2”) |
@CachePut
@CachePut 的作用 主要針對方法配置,能夠根據方法的請求引數對其結果進行快取,和 @Cacheable 不同的是,它每次都會觸發真實方法的呼叫。
主要的引數 value快取的名稱,在 spring 配置檔案中定義,必須指定至少一個
引數 | 解釋 | example |
---|---|---|
value | 快取的名稱,在 spring 配置檔案中定義,必須指定至少一個 | @CachePut(value=”my cache”) |
key | 快取的 key,可以為空,如果指定要按照 SpEL 表示式編寫,如果不指定,則預設按照方法的所有引數進行組合 | @CachePut(value=”testcache”,key=”#userName”) |
condition | 快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取 | @CachePut(value=”testcache”,condition=”#userName.length()>2”) |
@CacheEvict
@CachEvict 的作用 主要針對方法配置,能夠根據一定的條件對快取進行清空。 主要的引數 value快取的名稱,在 spring 配置檔案中定義,必須指定至少一個
引數 | 解釋 | example |
---|---|---|
value | 快取的名稱,在 spring 配置檔案中定義,必須指定至少一個 | @CacheEvict(value=”my cache”) |
key | 快取的 key,可以為空,如果指定要按照 SpEL 表示式編寫,如果不指定,則預設按照方法的所有引數進行組合 | @CacheEvict(value=”testcache”,key=”#userName”) |
condition | 快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取 | @CacheEvict(value=”testcache”,condition=”#userName.length()>2”) |
allEntries | 是否清空所有快取內容,預設為 false,如果指定為 true,則方法呼叫後將立即清空所有快取 | @CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation | 是否在方法執行前就清空,預設為 false,如果指定為 true,則在方法還沒有執行的時候就清空快取,預設情況下,如果方法執行丟擲異常,則不會清空快取 | @CachEvict(value=”testcache”,beforeInvocation=true) |
@CacheConfig
所有的@Cacheable()裡面都有一個value=“xxx”的屬性,這顯然如果方法多了,寫起來也是挺累的,如果可以一次性宣告完 那就省事了,
所以,有了@CacheConfig這個配置,@CacheConfig is a class-level annotation that allows to share the cache names,如果你在你的方法寫別的名字,那麼依然以方法的名字為準。
二、使用方法介紹
1.新增依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.新增yml配置檔案
spring:
redis:
host: localhost
port: 6379
password:
3.修改redis配置檔案
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import java.time.Duration;
@CacheConfig
@EnableCaching
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用 GenericFastJsonRedisSerializer 替換預設序列化
GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
// 設定key和value的序列化規則
redisTemplate.setKeySerializer(new GenericToStringSerializer<>(Object.class));
redisTemplate.setValueSerializer(genericFastJsonRedisSerializer);
// 設定hashKey和hashValue的序列化規則
redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
redisTemplate.setHashValueSerializer(genericFastJsonRedisSerializer);
// 設定支援事物
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 快取key生成策略
*/
@Bean
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
//類名稱
sb.append(target.getClass().getName());
sb.append(":");
//方法名稱
sb.append(method.getName());
for (Object param : params) {
sb.append(":");
//引數名稱
sb.append(param.toString());
}
return sb.toString();
};
}
/**
* 設定 redis 資料預設過期時間,預設1小時 設定@cacheable 序列化方式
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1))
.disableCachingNullValues()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
GenericFastJsonRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build();
}
}
4.使用方法
@Cacheable(value = "demoName", keyGenerator = "keyGenerator", sync = true)
public String getString(Integer moduleType, Integer isEnabled) {
return "測試";
}
@CacheEvict(value = "demoName", keyGenerator = "keyGenerator")
public String updateString(Integer moduleType, Integer isEnabled) {
return "測試";
}
三、總結
總之,註釋驅動的 spring cache 能夠極大的減少我們編寫常見快取的程式碼量,通過少量的註釋標籤和配置檔案,即可達到使程式碼具備快取的能力。且具備很好的靈活性和擴充套件性。但是我們也應該看到,spring cache 由於基於 spring AOP 技術,尤其是動態的 proxy 技術,導致其不能很好的支援方法的內部呼叫或者非 public 方法的快取設定,當然這都是可以解決的問題
相關文章
- springboot註解方式使用redis快取Spring BootRedis快取
- SpringBoot 註解呼叫Redis快取Spring BootRedis快取
- springboot整合redis2.x,使用spring註解進行快取Spring BootRedis快取
- springboot +lettuce +redis 快取使用Spring BootRedis快取
- redis 作為快取總結Redis快取
- spring配置redis註解快取SpringRedis快取
- 面試總結 —— Redis “快取穿透”、“快取擊穿”、“快取雪崩”面試Redis快取穿透
- 使用Redis做為MySQL的快取RedisMySql快取
- Mybatis的二級快取、使用Redis做二級快取MyBatis快取Redis
- 【SpringBoot】結合Redis實現快取Spring BootRedis快取
- 為什麼要使用Redis做快取Redis快取
- SpringBoot中使用Redis實現快取Spring BootRedis快取
- Redis 快取雪崩,快取擊穿和快取穿透技術方案總結Redis快取穿透
- SpringBoot整合Redis快取Spring BootRedis快取
- SpringBoot2 基礎案例(13):基於Cache註解,管理Redis快取Spring BootRedis快取
- SpringBoot中Shiro快取使用Redis、EhcacheSpring Boot快取Redis
- SpringBoot之日誌註解和快取優化Spring Boot快取優化
- Springboot 整合 SpringCache 使用 Redis 作為快取Spring BootGCRedis快取
- SpringBoot快取管理(二) 整合Redis快取實現Spring Boot快取Redis
- redis快取常見問題場景總結Redis快取
- 搞懂分散式技術14:Spring Boot使用註解整合Redis快取分散式Spring BootRedis快取
- Spring/SpringBoot常用註解總結Spring Boot
- 如何使用 Redis 快取Redis快取
- Laravel使用Redis快取LaravelRedis快取
- 介紹SpringBoot 整合 Redis 快取Spring BootRedis快取
- SpringBoot中整合Redis(快取篇)Spring BootRedis快取
- SpringBoot使用快取Spring Boot快取
- Spring-Boot專案中配置redis註解快取SpringbootRedis快取
- Spring快取註解@Cacheable、@CacheEvict、@CachePut使用Spring快取
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- Redis整合Spring結合使用快取例項RedisSpring快取
- Redis詳解 - SpringBoot整合Redis,RedisTemplate和註解兩種方式的使用RedisSpring Boot
- Entrust 在使用 Redis 做快取引擎的時候,快取不更新的問題RustRedis快取
- REDIS快取穿透,快取擊穿,快取雪崩原因+解決方案Redis快取穿透
- 【Redis】快取穿透,快取擊穿,快取雪崩及解決方案Redis快取穿透
- 常用快取系統使用經驗總結快取
- spring boot redis做mybatis二級快取Spring BootRedisMyBatis快取
- Spring Cache快取註解Spring快取