springboot2.0整合redis緩存註解

一、JSR107緩存規範

  • CachingProvider 【緩存提供者】

    定義了創建、配置、獲取、管理和控制多個CacheManager。一個應用可以在運行期訪問多個CachingProvider

  • CacheManager 【緩存管理】

    定義了創建、配置、獲取、管理和控制多個唯一命名的Cache,這些Cache存在於CacheManager的上下文中。一個CacheManager僅被一個CachingProvider所擁有

  • Cache 【緩存】

    是一個類似Map的數據結構並臨時存儲以Key爲索引的值。一個Cache僅被一個CacheManager所擁有

  • Entry 【條目】

    是一個存儲在Cache中的key-value對

  • Expiry 【到期】

    每一個存儲在Cache中的條目有一個定義的有效期。一旦超過這個時間,條目爲過期的狀態。一旦過期,條目將不可訪問、更新和刪除。緩存有效期可以通過ExpiryPolicy設置

springboot 常用緩存註解

Cache 緩存接口,定義緩存操作。實現有:RedisCache、EhCacheCache、ConcurrentMapCache等
CacheManager 緩存管理器,管理各種緩存(Cache)組件
@Cacheable 主要針對方法配置,能夠根據方法的請求參數對其結果進行緩存(添加緩存)
@CacheEvict 清空緩存
@CachePut 保證方法被調用,又希望結果被緩存(修改緩存)
@EnableCaching 開啓基於註解的緩存
keyGenerator 緩存數據時key生成策略
serialize 緩存數據時value序列化策略

1.開啓緩存的註解,啓動類上 @EnableCaching

2.標註緩存註解
CacheManager管理多個cache組件的,對緩存的真正CRUD操作在Cache組件中,每一個緩存組件有自己唯一一個名字;

註解說明:

@Cacheable 將【方法】的運行結果進行緩存

註解屬性說明:

屬性 屬性值 備註
value / cacheNames 例:test 指定緩存的名字
key 例:#id 緩存數據使用的key,默認是使用方法的參數值 編寫spel
keyGenerator 例: 寫一個配置類加上註解 @Configuration 【key和keyGenerator 二選一】
cacheManage 例: 寫一個配置類加上註解 @Configuration 緩存管理器【指定當前緩存放在哪個管理器中】
condition 例: #a0 > 1 符合指定條件的情況下才緩存
unless 例: #p0 <= 1 當unless指定條件爲true,方法的返回值就不會緩存
sync 例: false 是否異步處理,默認爲false

key的spel表達式部分語法:

 /**
 *  key 的方法屬性:  spel表達式:
 *      #root.methodName     獲取到被調用的【方法名字】
 *      #root.method.name    獲取到被調用的【方法名字】
 *      #root.target         當前被調用的【目標對象】
 *      #root.targetClass    當前被調用的【目標對象類】
 *      #root.args[0]        當前被調用的方法的【參數列表】
 *      #root.caches[0].name 當前方法被調用使用的緩存列表
 *      #iban、#a0、#p0      #參數名,  #a0 或 #p0 ,0代表參數的索引
 *      #result              方法執行後的返回值
 */

keyGenerator自定義key的生成的配置:

 /**
 *  自定義生成 key 的生成規則
 *  Bean的默認名字爲 【方法名】
 */
@Bean(value = "myKeyGenerator")
public KeyGenerator myKeyGenerator(){
    return new KeyGenerator() {
        @Override
        public Object generate(Object target, Method method, Object... params) {
            // 自定義key的生成策略
            return method.getName()+ Arrays.asList(params).toString();
        }
    };
}

cacheManage緩存管理器配

/**
 *  【redis緩存管理與springboot註解整合】
 *  @Primary 表示這是默認的 緩存管理器
 *  Bean的名字默認爲   【方法名】
 */
@Primary
@Bean
public RedisCacheManager myRedisCacheManager(RedisConnectionFactory factory) {
    RedisSerializer<String> redisSerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
            new Jackson2JsonRedisSerializer(Object.class);
    //解決查詢緩存轉換異常的問題
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    // 配置序列化(解決亂碼的問題)
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMillis(-1))
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
            .disableCachingNullValues();
    RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .transactionAware()
            .build();
    return cacheManager;
}

@CachePut 修改數據的同時,也會修改緩存

屬性值同上

@CacheEvict 清空緩存

屬性 屬性值 備註
allEntries 例: false 是否清空所有緩存
beforeInvocation 例: false 是否在方法執行之前清空緩存

@Caching 多條件複製緩存條件

 @Caching(
        cacheable = {
                @Cacheable(cacheNames = "uav2",key = "#p0")
        },
        put = {
                // cachePut 出現時,這個方法一定會執行
                @CachePut(cacheNames = "uav2",key = "#result.id"),
                @CachePut(cacheNames = "uav2",key = "#result.username")
        }
)

@CacheConfig 用在類上面,指定當前類下面緩存的通用屬性

引入maven:

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

部分配置application.yml

spring:
  redis:
    host: 47.101.50.211
    database: 1
    port: 6379
    password: 123456
    jedis:
      pool:
        # 連接池最大連接數,負值表示沒有限制
        max-active: 100
        # 連接池最大阻塞等待時間 -1 表示沒有限制
        max-wait: -1ms
        # 連接池中最大空閒連接
        max-idle: 10
        # 連接池中最小空閒連接
        min-idle: 0
    # 連接超時時間(毫秒)
    timeout: 1000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章