依賴
<!--springboot redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置
#redis
# Redis數據庫索引(默認爲0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認爲空)
spring.redis.password=love
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=16
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1
# 連接池中的最大空閒連接
spring.redis.jedis.pool.max-idle=8
# 連接池中的最小空閒連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=60000
#緩存默認過期時間 秒
redis.cache.default.ttl=86400
在spring boot 2.x中配好redis後,spring就已經爲我們創建好了對應的cacheManage,在使用@Cacheable等緩存註解後,緩存就會存到redis中
但是我們需要的自定義配置,如redisTemplate的key,value的序列化規則(默認是jdk的JdkSerializationRedisSerializer),以及緩存的默認過期時間(默認無),還有就是保存的鍵的生成策略
我的配置代碼
@Configuration
public class RedisConfiguration extends CachingConfigurerSupport {
@Value("${redis.cache.default.ttl}")
private long ttl;
/**
* redisTemplate
* @param factory
* @return
*/
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
// 使用Jackson2JsonRedisSerialize 替換默認序列化 JdkSerializationRedisSerializer 不替換可能出現亂碼
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 設置value的序列化規則和 key的序列化規則
//使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認使用JDK的序列化方式)
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//使用StringRedisSerializer來序列化和反序列化redis的key值
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 和spring提供的一樣
* @param factory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory){
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(factory);
return stringRedisTemplate;
}
/**
* redis緩存配置
* spring2 整合 redis 後,已存在
* 可自定義配置
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(ttl));
return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(factory)).cacheDefaults(redisCacheConfiguration).build();
}
@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(":");
sb.append(method.getName());
for (Object obj : params) {
sb.append(":" + obj);
}
String rsToUse = String.valueOf(sb);
System.out.println(ttl);
System.out.println("調用Redis緩存Key : " + rsToUse);
return rsToUse;
}
};
}
}
這種緩存配置,就針對於使用註解@Cacheable @CachePut @CacheEvit進行緩存
也可以自定義註解實現reidis緩存,可自定義更多可需要的操作,可參考SpringBoot Redis 緩存失效設置(手寫