1. 程式人生 > >Spring Boot整合redis,key自定義生成

Spring Boot整合redis,key自定義生成

redis key生成策略程式碼:

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.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCachePrefix;
import org.springframework.data.redis.core.RedisTemplate;

import com.alibaba.fastjson.JSON;

/**
 * redis配置工具類
 * @Configuration表示當前類屬於配置類
 * @EnableCaching表示支援快取
 * @author ouyangjun
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

	/**
	 * redis key生成策略
	 * target: 類
	 * method: 方法
	 * params: 引數
	 * @return KeyGenerator
	 * 
	 * 注意: 該方法只是聲明瞭key的生成策略,還未被使用,需在@Cacheable註解中指定keyGenerator
	 *      如: @Cacheable(value = "key", keyGenerator = "cacheKeyGenerator")
	 */
    @Bean
    public KeyGenerator cacheKeyGenerator() {
        return (target, method, params) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(method.getName());
            for (Object obj : params) {
            	// 由於引數可能不同, hashCode肯定不一樣, 快取的key也需要不一樣
                sb.append(JSON.toJSONString(obj).hashCode());
            }
            return sb.toString();
        };
    }

    /**
     * redis全域性預設配置
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
        redisCacheManager.setUsePrefix(true);
        // key快取的字首,以conf開頭
        RedisCachePrefix cachePrefix = new RedisPrefix("conf");
        redisCacheManager.setCachePrefix(cachePrefix);
        // key快取的過期時間, 600秒
        redisCacheManager.setDefaultExpiration(600L);
        return redisCacheManager;
    }

}

註解說明:

@Cacheable支援如下幾個引數:

value:快取位置的一段名稱,不能為空

key:快取的key,預設為空,表示使用方法的引數型別及引數值作為key,支援SpEL

keyGenerator:指定key的生成策略

condition:觸發條件,滿足條件就加入快取,預設為空,表示全部都加入快取,支援SpEL

@CacheEvict支援如下幾個引數:

value:快取位置的一段名稱,不能為空

key:快取的key,預設為空,表示使用方法的引數型別及引數值作為key,支援SpEL

condition:觸發條件,滿足條件就加入快取,預設為空,表示全部都加入快取,支援SpEL

allEntries:true表示清除value中的全部快取,預設為false

測試程式碼

package hk.com.cre.process.basic.service.impl;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;

public class RdisCacheTest {

	/**
	 * 快取test
	 * 快取生成規則: conf:redis:類名方法名引數hashcode
	 * @param param1
	 * @param param2
	 * @return
	 * 
	 * 注意: @Cacheable註解生成的型別在redis中預設都是string
	 *      在每次請求的時候,都是先根據key到redis查詢是否存在,如不存在則執行方法中的程式碼
	 */
	@Cacheable(value = "redis", keyGenerator = "cacheKeyGenerator")
	public String getRedisString(String param1, String param2) {
		return param1+":"+param2;
	}
	
	/**
	 * 清除快取
	 * @return
	 */
	@CacheEvict(value = "redis", allEntries = true)
    public String cleanCache() {
        return "success";
    }
	
}

本章完結,待續!

本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源