SpringBoot开发之路——集成Redis

项目地址:nm-example
今天开发的时候遇到一个需求:
在集群部署服务时,需要处理定时任务不能同一时间执行。
后面实现的思路是这样的:
后之后就顺便在springBoot 上面实现了一下主要代码部分所以在这里记录一下。

  • 每个定时任务都需要设置一下执行时间的间隔
  • 每个定时任务执行时,都要到redis 里面检查一下,执行时间。
  • 如果redis 里面没有值则可以认为没有别的服务执行过,此时可以执行任务
  • 否则取出redis 中保存的上一次执行时间判定,如果上次执行的时间与当前时间判定,已经超过执行定时任务的时间间隔。
  • 如果超过则可以执行,否则不执行
  • 如何保证redis中存放的执行时间数据的原子性?
  • 这里使用的是redis 的乐观锁,watch。数据提交时如果数据版本与原来取出的数据版本不一致则提交失败,此时放弃执行定时任务。所以在这里使用 “乐观锁” 非常合适

这里使用的springBoot 版本为:


    
        UTF-8
        UTF-8
        1.8
        Finchley.SR1
    
    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.6.RELEASE
         
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
            
                org.apache.commons
                commons-pool2
                2.4.3
            
        
    

以前使用的版本为:

    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.1.RELEASE
         
    

所以集成的时候出现了一些问题,原因是:

//原版本
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;

//2.xx以后使
import org.springframework.data.redis.connection.RedisConnectionFactory;

创建:redisTemplate


/***
 *
 * @Auther: guzhangwen
 * @BusinessCard https://blog.csdn.net/gu_zhang_w
 * @Date: 2019/10/24
 * @Time: 21:46
 * @version : V1.0
 */
@Configuration
public class MyConfigure {

    /**
     * 操作redis 模板工具类
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate goodsRedisTemplate = new RedisTemplate<>();
        goodsRedisTemplate.setConnectionFactory(redisConnectionFactory);
        /**
         * 设置value 类型的序列化实现,如果不设置使用increment 会报错
         */
        GenericToStringSerializer genericToStringSerializer = new GenericToStringSerializer(Object.class);
        goodsRedisTemplate.setValueSerializer(genericToStringSerializer);
        goodsRedisTemplate.setKeySerializer(new StringRedisSerializer());
        goodsRedisTemplate.afterPropertiesSet();
        return goodsRedisTemplate;
    }
}

之后就可以通过注入使用redisTemplate了

你可能感兴趣的:(SpringBoot开发之路——集成Redis)