springboot整合redis及其註解式開發

Dawn.x發表於2020-12-02

springboot整合redis

匯入pom依賴

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

yml配置

spring:
  redis:
      database: 0
      host: xxx
      port: 6379
      password: 123456
      jedis:
          pool:
              max-active: 100
              max-idle: 3
              max-wait: -1
              min-idle: 0
      timeout: 1000

建立RedisConfig
RedisConfig類用於Redis資料快取

package com.xiaoyang.springbootmybatis.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
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.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.lang.reflect.Method;
import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;


/**
 * redis配置類
 **/
@Configuration
@EnableCaching//開啟註解式快取
//繼承CachingConfigurerSupport,為了自定義生成KEY的策略。可以不繼承。
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 生成key的策略 根據類名+方法名+所有引數的值生成唯一的一個key
     *
     * @return
     */
    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

    /**
     * 管理快取
     *
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        //通過Spring提供的RedisCacheConfiguration類,構造一個自己的redis配置類,從該配置類中可以設定一些初始化的快取名稱空間
        // 及對應的預設過期時間等屬性,再利用RedisCacheManager中的builder.build()的方式生成cacheManager:
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();  // 生成一個預設配置,通過config物件即可對快取進行自定義配置
        config = config.entryTtl(Duration.ofMinutes(1))     // 設定快取的預設過期時間,也是使用Duration設定
                .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)));

        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)     // 使用自定義的快取配置初始化一個cacheManager
                .initialCacheNames(cacheNames)  // 注意這兩句的呼叫順序,一定要先呼叫該方法設定初始化的快取名,再初始化相關的配置
                .withInitialCacheConfigurations(configMap)
                .build();
        return cacheManager;
    }

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(預設使用JDK的序列化方式)
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        template.setValueSerializer(serializer);
        //使用StringRedisSerializer來序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(factory);
        return stringRedisTemplate;
    }

}

   @Configuration
  
  @Configuration底層是含有@Component ,所以@Configuration 具有和 @Component 的作用。
  @Configuration可理解為用spring的時候xml裡面的<beans>標籤。
  注: 
  1) 配置類必須以類的形式提供(不能是工廠方法返回的例項),允許通過生成子類在執行時增強(
  cglib 動態代理)。
  2) 配置類不能是 final 類(沒法動態代理)。
  3) 配置註解通常為了通過 @Bean 註解生成 Spring 容器管理的類。
  4) 配置類必須是非本地的(即不能在方法中宣告,不能是 private)。
  5) 任何巢狀配置類都必須宣告為static6) @Bean方法不能建立進一步的配置類(也就是返回的bean如果帶有@Configuration,
  也不會被特殊處理,只會作為普通的 bean)。
   @EnableCaching
  1) @EnableCaching註解是spring framework中的註解驅動的快取管理功能。
  自spring版本3.1起加入了該註解。
  2) 如果你使用了這個註解,那麼你就不需要在XML檔案中配置cache manager了。
  3) 當你在配置類(@Configuration)上使用@EnableCaching註解時,會觸發一個post processor,
  這會掃描每一個spring bean,檢視是否已經存在註解對應的快取。如果找到了,
  就會自動建立一個代理攔截方法呼叫,使用快取的bean執行處理。
  @Bean
  @Bean可理解為用spring的時候xml裡面的<bean>標籤。
  注: 
  1) @Bean註解在返回例項的方法上,如果未通過@Bean指定bean的名稱,則預設與標註的方法名相同; 
  
  2) @Bean註解預設作用域為單例singleton作用域,可通過@Scope(“prototype”)設定為原型作用域;
  
  3) 既然@Bean的作用是註冊bean物件,那麼完全可以使用@Component@Controller@Service@Repository等註解註冊bean(在需要註冊的類上加註解),
  當然需要配置@ComponentScan註解進行自動掃描。

名字my-redis-cache1和my-redis-cache2為兩個快取槽

結合註解開發

@Cacheable:作用是主要針對方法配置,能夠根據方法的請求引數對其結果進行快取 
主要引數說明: 
  1) value : 
  快取的名稱,在 spring 配置檔案中定義,必須指定至少一個,
  例如:@Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”}2) key :快取的 key,可以為空,
  如果指定要按照 SpEL 表示式編寫,如果不指定,則預設按照方法的所有引數進行組合,
  例如:@Cacheable(value=”testcache”,key=”#userName”)3) condition :快取的條件,可以為空

@CachePut:作用是主要針對方法配置,能夠根據方法的請求引數對其結果進行快取,
和 @Cacheable 不同的是,它每次都會觸發真實查詢
  方法的呼叫 
  主要引數說明:
  引數配置和@Cacheable一樣。


@CacheEvict:作用是主要針對方法配置,能夠根據一定的條件對快取進行清空 

在這裡插入圖片描述

相關文章