記錄下整合的過程
step1
pom引用
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!--如果需要redisson則需要引入-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.8.0</version>
</dependency>
step2
寫配置類(名字任意)
CacheConfiguration
package com.jike.goldenpig.configration;
import org.redisson.api.RedissonClient;
import org.redisson.spring.cache.CacheConfig;
import org.redisson.spring.cache.RedissonSpringCacheManager;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
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.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
*
*
* @author azhang.wang wangzhang367@163.com
* @version CacheConfiguration.java, v 0.1 2017-02-21 10:38 AM Exp $
*/
@Configuration
public class CacheConfiguration extends CachingConfigurerSupport {
public static final String DEFALUT_KEY="DEFALUT_KEY";
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(factory);
RedisSerializer keySerializer = new StringRedisSerializer();
template.setKeySerializer(keySerializer);
template.setHashKeySerializer(keySerializer);
GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
// 設(shè)置內(nèi)容序列化類
template.setValueSerializer(jsonSerializer);
template.afterPropertiesSet();
return template;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//想要的一個(gè)過期時(shí)間集合甘畅,如果在集合內(nèi)則會(huì)使用集合設(shè)定的過期時(shí)間過期
Map<String, Long> expires = new HashMap<>();
//設(shè)置特定namespace的過期時(shí)間酒请,優(yōu)雅點(diǎn)可以抽出公共的constants第练,這里為了演示直接寫名稱
expires.put("people", 20L);
//自定義一個(gè)默認(rèn)的key魂拦,默認(rèn)時(shí)間為60*60秒
expires.put(DEFALUT_KEY, 60*60L);
// 設(shè)置超時(shí)
cacheManager.setExpires(expires);
// 其他沒有在expires中的namespace,設(shè)置的默認(rèn)過期時(shí)間
cacheManager.setDefaultExpiration(60 * 60);
return cacheManager;
}
@Bean
CacheManager cacheManager(RedissonClient redissonClient) {
Map<String, CacheConfig> config = new HashMap<>(16);
// create "testMap" cache with ttl = 24 minutes and maxIdleTime = 12 minutes
config.put("user", new CacheConfig(20*1000, 12 * 60 * 1000));
config.put("people", new CacheConfig(30*1000, 12 * 60 * 1000));
return new RedissonSpringCacheManager(redissonClient, config);
}
@Override
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append("CacheKey:");
sb.append(target.getClass().getSimpleName());
sb.append('.').append(method.getName()).append(":");
// 這里需要注意豌研,參數(shù)太多的話考慮使用其他拼接方式
for (Object obj : params) {
if (obj != null) {
sb.append(obj.toString());
sb.append(".");
}
}
return sb.toString();
}
};
}
}
以上 cacheManager 任意選擇一個(gè)開啟就好了哮幢。
可以看到,不管哪種方式扇救,給容器一個(gè)CacheManager即可
step3
使用方式
int i = 0;
@RequestMapping(value = "cache")
@ResponseBody
@Cacheable("people")
public int cache(String a,String b) {
i++;
return i;
}
@RequestMapping(value = "cache2")
@ResponseBody
@Cacheable("user")
public int cache2(String a,String b) {
i++;
return i;
}
@RequestMapping(value = "index")
@Cacheable(CacheConfiguration.DEFALUT_KEY)
public String index(ModelAndView mv) {
mv.addObject("name", "rose");
mv.setViewName("index");
return "index";
}
這里直接在控制層添加了刑枝,大家自己玩吧。
這里說下迅腔,使用redission和RedisTemplate的差別很小装畅,但是他們保存在redis中的key是不一樣的,原因是他們的失效機(jī)制不一樣
redission的會(huì)生成以下幾個(gè)key
redisson使用的是持久化的key沧烈,同時(shí)綁定在自身的定時(shí)任務(wù)中掠兄,時(shí)間到了就會(huì)觸發(fā)剔除動(dòng)作,從而達(dá)到過期的效果
RedisTemplate則是直接生成key,
這是跟redisson不同的地方蚂夕,同時(shí)給他設(shè)定失效時(shí)間迅诬,但是會(huì)生成一個(gè)命名空間對應(yīng)的key,來記錄所有生成的記錄婿牍,這個(gè)key也會(huì)失效百框,但是失效時(shí)間是循環(huán)的,目前還不知道為什么這樣做牍汹,只能看到便于統(tǒng)計(jì)
對比兩者的結(jié)構(gòu),redisson使用的方式占用的redis中key的數(shù)量會(huì)少很多柬泽,由此帶來一些便利慎菲,比如刪除
擴(kuò)展可以參考這篇文章
Spring Boot緩存實(shí)戰(zhàn) Redis 設(shè)置有效時(shí)間和自動(dòng)刷新緩存,時(shí)間支持在配置文件中配置