专栏首页码农小胖哥的码农生涯Redis也能搞定时任务,你们耗子尾汁

Redis也能搞定时任务,你们耗子尾汁

朋友们好啊,我是码农小胖哥。

今天有个同学问我在吗,我说什么事?

给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的。

他说了两种选择,一种是用DelayQueue,一种是用消息队列。

他说,胖哥你能不能教我点招式混元功法,帮我完成这个需求。

我说可以!

我说你这两种都不好用,他不服气。

我说那你写个DelayQueue来看看,他写不出来。

他说你这估计也不会,我说我确实不会。

这是 JUC,传统底层开发是要讲基础的,必须融会贯通,我只会调包。

这种定时任务我用 Redis 更简单些。

他让我写个 DEMO,我说可以!

我一说,他啪就发了个表情

很快啊,我就打开 IDEA,一个 DEMO 就出来了。

一个重写了 Redis 的 Key 失效监听器:

/**
 *  当redis 中的key过期时,触发一个事件。
 *  我们可以算好需要执行的时间间隔作为key失效时间,这样就可以保证到点执行逻辑了。
 */
public class RedisEventMessageListener extends KeyExpirationEventMessageListener {

    /**
     * Instantiates a new Redis event message listener.
     *
     * @param listenerContainer the listener container
     */
    public RedisEventMessageListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }


    @Override
    protected void doHandleMessage(Message message) {
        String key = message.toString();
        // 这个就是过期的key ,过期后,也就是事件触发后对应的value是拿不到的。
        // 这里实现业务逻辑,如果是服务器集群的话需要使用分布式锁进行抢占执行。
        System.out.println("key = " + key);
        System.out.println("end = " + LocalDateTime.now());
    }
}

一个监听器的配置:

/**
 * Redis 消息监听器容器.
 *
 * @param redisConnectionFactory the redis connection factory
 * @return the redis message listener container
 */
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
    RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
    redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
    return redisMessageListenerContainer;
}


/**
 * Redis Key失效监听器注册为Bean.
 *
 * @param redisMessageListenerContainer the redis message listener container
 * @return the redis event message listener
 */
@Bean
public RedisEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){
    return new RedisEventMessageListener(redisMessageListenerContainer);
}

一个执行测试:

@Test
public void redisJobTest() {
    // 调用 redisTemplate 对象设置一个10s 后过期的键,不出意外 10s 后键过期后会触发事件打印结果
    redisTemplate.boundValueOps("job").set("10s",10, TimeUnit.SECONDS);
    System.out.println("begin = " + LocalDateTime.now());
    try {
        // 测试需要休眠才能看到结果
        Thread.sleep(20000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // ---------测试结果---------
    // begin = 2020-11-18T00:19:09.272
    // key = job
    // end = 2020-11-18T00:19:19.369
}

写完之后自然是传统编程思路点到为止,我把代码发给他,我打算放松一下,摸一摸鱼。

我本来想让他给我公众号文章转发、再看、点赞,我想着他会主动去点赞。

我大意了,没有说。

然后两分钟后他告诉我他搞定了,但是并没有关注我。

我说同学你不讲规矩,你不懂。

他忙说对不起,我不懂规矩啊!

我说年轻人,

不讲规矩,

来,

白嫖!

我五年经验的小码农。

这好吗?这不好。

我劝这位同学,

耗子尾汁。

好好反思。

赶紧关注、点赞、转发、再看。

码农们要以和为贵,要讲规矩,

不要老是白嫖。

本文分享自微信公众号 - 码农小胖哥(Felordcn),作者:码农小胖哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Redis中使用Lua脚本实现高并发原子操作

    在上一文中我对 Lua 语言的一些简单的语法及其在 Redis 中的操作进行了介绍,但是在 Java 开发中我们还需要进一步的学习才能使这种技术落地。今天就结合...

    码农小胖哥
  • JDBC 规范回顾

    JDBC 是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。java 提供了jdbc的接口...

    码农小胖哥
  • Mybatis是如何向Spring注册Mapper的

    有时候我们需要自行定义一些注解来标记某些特定功能的类并将它们注入Spring IoC容器。比较有代表性的就是Mybatis的Mapper接口。假如有一个新的需求...

    码农小胖哥
  • java字节码byte code简介

    Byte Code也叫做字节码,是连接java源代码和JVM的桥梁,源代码编译成为字节码,而字节码又被加载进JVM中运行。字节码怎么生成,怎么查看字节码,隐藏在...

    程序那些事
  • CentOS 7 配置Java语言开发环境

    CentOS 7 配置Java语言开发环境 初始化设置参考:http://blog.csdn.net/wh211212/article/details/529...

    shaonbean
  • 如何将CDH集群JAVA升级至JDK8

    大家都知道在安装CDH时默认安装的JDK版本为jdk1.7.0_67,部分企业开发环境为JDK8版本,这个时候可能会出现在本地开发的应用在集群中无法正常运行。那...

    Fayson
  • DDL 描述数据世界

    关系型数据库是指“采用了关系模型来组织数据的数据库,以行和列的形式存储数据,便于用户理解。关系型数据库这一系列的行和列被称为表,一组表组成了数据库。”

    DataScience
  • 目标检测的常用数据处理方法!

    在上节内容中,我们介绍了目标检测的基础概念,并分析了实现目标检测的常用思路,本篇文章将重点介绍在该领域的经典数据集:VOC数据集,以及使用Dataloader对...

    Datawhale
  • 从0上手Kaggle图像分类挑战:冠军解决方案详解

    【新智元导读】这篇文章介绍了作者在Kaggle植物幼苗分类比赛使用的方法,该方法连续几个月排名第一,最终排名第五。该方法非常通用,也可以用于其他图像识别任务。

    新智元
  • 1016 部分A+B (15 分)

    正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA。例如:给定 A=3862767,DA=6,则 A 的“6 部分”PA...

    可爱见见

扫码关注云+社区

领取腾讯云代金券