飞道的博客

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

401人阅读  评论(0)

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

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

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

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

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

我说可以!

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

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

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

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

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

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

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

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

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


   
  1. /**
  2.  *  当redis 中的key过期时,触发一个事件。
  3.  *  我们可以算好需要执行的时间间隔作为key失效时间,这样就可以保证到点执行逻辑了。
  4.  */
  5. public class RedisEventMessageListener extends KeyExpirationEventMessageListener {
  6.      /**
  7.      * Instantiates a new Redis event message listener.
  8.      *
  9.      * @param listenerContainer the listener container
  10.      */
  11.     public RedisEventMessageListener(RedisMessageListenerContainer listenerContainer) {
  12.         super(listenerContainer);
  13.     }
  14.     @Override
  15.     protected void doHandleMessage(Message message) {
  16.         String key = message.toString();
  17.          // 这个就是过期的key ,过期后,也就是事件触发后对应的value是拿不到的。
  18.          // 这里实现业务逻辑,如果是服务器集群的话需要使用分布式锁进行抢占执行。
  19.         System.out. println( "key = " + key);
  20.         System.out. println( "end = " + LocalDateTime.now());
  21.     }
  22. }

一个监听器的配置:


   
  1. /**
  2.  * Redis 消息监听器容器.
  3.  *
  4.  * @param redisConnectionFactory the redis connection factory
  5.  * @return the redis message listener container
  6.  */
  7. @Bean
  8. public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
  9.     RedisMessageListenerContainer redisMessageListenerContainer =  new RedisMessageListenerContainer();
  10.     redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
  11.      return redisMessageListenerContainer;
  12. }
  13. /**
  14.  * Redis Key失效监听器注册为Bean.
  15.  *
  16.  * @param redisMessageListenerContainer the redis message listener container
  17.  * @return the redis event message listener
  18.  */
  19. @Bean
  20. public RedisEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){
  21.      return  new RedisEventMessageListener(redisMessageListenerContainer);
  22. }

一个执行测试:


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

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

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

我大意了,没有说。

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

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

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

我说年轻人,

不讲规矩,

来,

白嫖!

我五年经验的小码农。

这好吗?这不好。

我劝这位同学,

耗子尾汁。

好好反思。

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

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

不要老是白嫖。

多多关注:码农小胖哥

谢谢同学们!

2020年最全的人工智能学习路径!文末领取福利

Spring Security 实战干货:OAuth2授权回调的处理机制

Spring MVC的视图居然还能把文件展现给前端


转载:https://blog.csdn.net/qq_35067322/article/details/109792788
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场