Redis系列:自定义Redistemplate和RediUtil撰写(四)

序言

在前面的文章中,关于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值