序言
在前面的文章中,关于RedisConfig配置中Redistemplate的重写没有过多的介绍,在这篇文章中具体讲Redistemplate的通用配置,拿来就能用。还会补充通用的RediUtils的撰写(企业开发中常用)等
自定义Redistemplate
首先我们找到org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
:
然后我们点进去看一下redis自动配置的源码如下:
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({
RedisOperations.class})
@EnableConfigurationProperties({
RedisProperties.class})
@Import({
LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(
name = {
"redisTemplate"}
)
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
在上述的源码中我们可以看到,已经为我们默认提供了RedisTemplate<Object, Object>
和StringRedisTemplate
,@ConditionalOnSingleCandidate()
注解的意思是,只要我们不自己配置Redistemplate
,默认会使用这个源码中默认的,接下来我们就来看一下写的这个通用的Redistemplate
模板:
/**
* RedisTemplate通用模板
* @param factory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
//(1)Json序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//过期方法
//om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
/**
* Jackson ObjectMapper 中的 enableDefaultTyping 方法由于安全原因,
* 从 2.10.0 开始标记为过期,建议用 activateDefaultTyping 方法代替,
* 所以如果继续使用 enableDefaultTyping 会有警告出现,我们现在要消除这个警告,
* 去看一下 enableDefaultTyping 源码
*/
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
//(2)String的序列化
RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
//序列化设置,这样为了存储操作对象时正常显示的数据,也能正常存储和获取
//key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
//hash的key采用String序列化
template.setHashKeySerializer(stringRedisSerializer);
//value采用Json序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value采用json序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
注意:
但是在企业的开发中,我们大部分情况下不会去使用这个原生的方式取编写代码,接下来我就会写一个通用的RedisUtil
,你可以拿来就用。
RedisUtil
/**
* 定义为一个组件
*/
@Component
public final class RedisUtil {
/**
* 注入RedisTemplate
*/
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
* @return
* @author twy
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key获取过期时间
*
* @param key
* @return 返回时间(秒),返回0代表永久有效
* @author t