1. 程式人生 > 程式設計 >SpringCache 分散式快取的實現方法(規避redis解鎖的問題)

SpringCache 分散式快取的實現方法(規避redis解鎖的問題)

簡介

spring 從3.1 開始定義

  • org.springframework.cache.Cache
  • org.springframework.cache.CacheManager

來統一不同的快取技術
並支援使用JCache(JSR-107)註解簡化我們的開發

在這裡插入圖片描述

基礎概念

在這裡插入圖片描述

實戰使用

整合SpringCache簡化快取開發

常用註解

常用註解 說明
@CacheEvict 觸發將資料從快取刪除的操作 (失效模式)
@CachePut 不影響方法執行更新快取
@Caching 組合以上多個操作
@CacheConfig 在類級別共享快取的相同配置
@Cacheable 觸發將資料儲存到快取的操作

方法

1)、開啟快取功能 @EnableCaching
2)、只需要使用註解就能完成快取操作

1、引入依賴

spring-boot-starter-cache、spring-boot-starter-data-redis
配合redis使用

<!-- 引入 redis-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
 <!-- 排除 lettuce -->
 <exclusions>
  <exclusion>
   <groupId>io.lettuce</groupId>
   <artifactId>lettuce-core</artifactId>
  </exclusion>
 </exclusions>
</dependency>

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

2、寫配置

在專案新建config資料夾,新建一個config類

在這裡插入圖片描述

程式碼如下:

@EnableConfigurationProperties(CacheProperties.class)//為configuration容器中放參數
@EnableCaching
@Configuration
public class MyCacheConfig {

 /**
  * 配置檔案中的內容不再生效(全部走自定義配置)
  * @param cacheProperties
  * @return
  */
 @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 redisProperties = cacheProperties.getRedis();

  if (redisProperties.getTimeToLive() != null) {
   config = config.entryTtl(redisProperties.getTimeToLive());
  }

  if (redisProperties.getKeyPrefix() != null) {
   config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
  }

  if (!redisProperties.isCacheNullValues()) {
   config = config.disableCachingNullValues();
  }

  if (!redisProperties.isUseKeyPrefix()) {
   config = config.disableKeyPrefix();
  }

  return config;

 }
}
(1)、自動配置寫了哪些
  CacheAutoConfiguration 會匯入 RedisAutoConfiguration
  自動配置好快取管理器RedisCacheManager
  (2)、配置使用redis做為快取
  spring.cache.typeredis

3、修改pom 配置

spring:
 cache:
 type: redis
 redis:
  # 快取過期時間
  time-to-live: 60000
  # 如果制定了字首,我們就是用指定的字首,如果沒有我們就預設使用快取的名字作為字首
  key-prefix: CACHE_
  # 是否使用字首
  use-key-prefix: true
  # 是否把快取空值,防止快取穿透
  cache-null-values: true

4、原理

在這裡插入圖片描述

 1、每一個要快取的資料 我們都來指定要放到那個名字的快取【快取的分割槽(按照業務型別)】
 2、@cacheable({"category"})
  代表當前方法的結果需要快取,如果快取中,方法不用呼叫
  如果快取中沒有,會呼叫方法,最後將方法的結果放入快取
 3、預設行為
  1)、如果快取中有,方法不用呼叫
  2)、key預設自動生成:快取的名字::SimpleKey[] (自主生成的key值)
  3)、快取的value的值。預設使用jdk序列化機制,將序列化後的資料存到redis
  4)、預設 ttl 時間 -1 (永不過期)


  自定義:
  1)、指定生成的快取使用的key: key屬性制定,接受一個SpEL
   SpEL(詳見文件)
  2)、指定快取的資料的存活時間:配置檔案中修改 ttl
  3)、將資料儲存為 json 格式:
    自定義 RedisCacheConfiguration即可

失效模式:@CacheEvict

原理:變更快取的時候會將redis中的快取刪除
(當下次查詢時,會重新載入快取)

在這裡插入圖片描述

推薦使用@CacheEvict

同時進行多種快取操作 @Caching指定刪除某個分割槽下的所有資料
@CacheEvict(value=“category”,allEntries=true)儲存統一型別的資料,都可以指定成同一個分割槽。分割槽名預設就是快取的字首

類中使用:@CacheEvict(value=“category”,allEntries=true)
配置中使用:(禁用字首 + 預設字首)
spring.cache.redis.use-key-prefix=true

在這裡插入圖片描述

雙寫模式:@CachePut

原理:在變更快取時,刪除原有的快取,然後將新資料重新插入到快取中

到此這篇關於SpringCache 分散式快取(規避redis解鎖的問題)的文章就介紹到這了,更多相關SpringCache 分散式快取內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!