美文网首页
SpringBoot开发之路——集成Redis

SpringBoot开发之路——集成Redis

作者: 我是顾子晨 | 来源:发表于2019-10-24 23:10 被阅读0次

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

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

    这里使用的springBoot 版本为:

    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring-cloud.version>Finchley.SR1</spring-cloud.version>
        </properties>
        
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-pool2</artifactId>
                    <version>2.4.3</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    

    以前使用的版本为:

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    

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

    //原版本
    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<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> 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

          本文链接:https://www.haomeiwen.com/subject/aurjvctx.html