1. 程式人生 > >Springboot2.0整合Redis(註解開發)

Springboot2.0整合Redis(註解開發)

一. pom.xm檔案引入對應jar包

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

二. application.yml引入redis服務端配置

  # redis相關配置
  redis:
    host: 192.168.80.3
    port: 6379
    database: 
0 timeout: 60s # 資料庫連線超時時間,springboot2.0 中該引數的型別為Duration,這裡在配置的時候需要指明單位 # 連線池配置,springboot2.0中直接使用jedis或者lettuce配置連線池 jedis: pool: # 最大空閒連線數 max-idle: 500 # 最小空閒連線數 min-idle: 50 # 等待可用連線的最大時間,負數為不限制 max-wait: -1s # 最大活躍連線數,負數為不限制 max
-active: -1

  說明:Jedis和Lettuce的比較:

     Jedis :

      直連模式,在多個執行緒間共享一個 Jedis 例項時是執行緒不安全的,如果想要在多執行緒環境下使用 Jedis,需要使用連線池,

      每個執行緒都去拿自己的 Jedis 例項,當連線數量增多時,物理連線成本較高。

     Lettuce:

      連線是基於Netty的,連線例項可以在多個執行緒間共享,

      所以,一個多執行緒的應用可以使用同一個連線例項,而不用擔心併發執行緒的數量。當然這個也是可伸縮的設計,一個連線例項不夠的情況也可以按需增加連線例項。

      通過非同步的方式可以讓我們更好的利用系統資源,而不用浪費執行緒等待網路或磁碟I/O。

三.RedisConfig 配置RedisTemplate和CacheManage

package com.luckydan.springboot.config;

import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
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.StringRedisSerializer;

/**
* @package: com.luckydan.springboot.config
* @description: redis配置檔案
* @author: gl
* @date: 2018年11月23日
* @version: 1.0.0
 */
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    
    @Bean(name="redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
 
        FastJsonRedisSerializer<Object> serializer = new FastJsonRedisSerializer<Object>(Object.class);
     // value值的序列化採用fastJsonRedisSerializer
        template.setValueSerializer(serializer);
        template.setHashValueSerializer(serializer);
        // key的序列化採用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
 
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
    
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        // 生成一個預設配置,通過config物件即可對快取進行自定義配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();  
        // 設定快取的預設過期時間,也是使用Duration設定
        config = config.entryTtl(Duration.ofMinutes(1))    
                .disableCachingNullValues();     // 不快取空值

        // 設定一個初始化的快取空間set集合
        Set<String> cacheNames =  new HashSet<>();
        cacheNames.add("my-redis-cache1");
        cacheNames.add("my-redis-cache2");

        // 對每個快取空間應用不同的配置
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("my-redis-cache1", config);
        configMap.put("my-redis-cache2", config.entryTtl(Duration.ofSeconds(120)));
        
        // 使用自定義的快取配置初始化一個cacheManager
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)     
                .initialCacheNames(cacheNames)  // 注意這兩句的呼叫順序,一定要先呼叫該方法設定初始化的快取名,再初始化相關的配置
                .withInitialCacheConfigurations(configMap)
                .build();
        return cacheManager;
    }
}

說明:在獲取RedisTemplate過程中需要對key-value鍵值對分別進行序列化操作,可以使用Springboot自帶的Jackson2JsonRedisSerializer進行序列化,也可以使用fastjson進行自定義序列化

自定義序列化:略

四.整合Redis需要使用的註解介紹:

  [email protected]  可以標記在方法上,也可以標記在類上。當標記在方法上時表示該方法是支援快取的,當標記在類上時則表示該類所有的方法都是支援快取的。應用到讀取資料的方法上,將先從快取中讀取該方法的返回值,如果沒

     有再從DB獲取資料,然後把資料新增到快取中

      快取是以鍵值對進行的,值就是方法的返回結果,至於鍵的話,Spring又支援兩種策略,預設策略和自定義策略,需要注意的是當一個支援快取的方法在物件內部被呼叫時是不會觸發快取功能的

  [email protected]  應用到刪除資料的方法上,呼叫方法時會從快取中刪除對應key的資料

   屬性值:value,key,condition,allentries,beforeInvocation

引數 解釋 example
value 快取的名稱,在 spring 配置檔案中定義,必須指定至少一個 例如:
@Cacheable(value=”mycache”)
@Cacheable(value={”cache1”,”cache2”}
key 快取的 key,可以為空,如果指定要按照 SpEL 表示式編寫,如果不指定,則預設按照方法的所有引數進行組合 @CacheEvict(value=”user”,key=”#userName”)
condition 快取的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,只有為 true 才進行快取 @CacheEvict(value=”user”,condition=”#userName.length()>2”)
allentries 是否清空所有快取內容,預設為 false,如果指定為 true,則方法呼叫後將立即清空所有快取 @CachEvict(value=”user”,allEntries=true)
beforeInvocation 是否在方法執行前就清空,預設為 false,如果指定為 true,則在方法還沒有執行的時候就清空快取,預設情況下,如果方法執行丟擲異常,則不會清空快取 @CachEvict(value=”user”,beforeInvocation=true)

  [email protected] 應用到寫資料的方法上,如新增/修改方法,呼叫方法時會自動把相應的資料放入快取,

   具體步驟如下:Spring在每次執行前都會檢查Cache中是否存在相同key的快取元素,如果存在就不再執行該方法,而是直接從快取中獲取結果進行返回,否則才會執行並將返回結果存入指定的快取中。 

   與@Cacheable的區別:執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中