文档章节

基于Redis的定时任务

冷冷gg
 冷冷gg
发布于 2017/05/26 19:03
字数 463
阅读 3171
收藏 52

基于Redis的定时任务

最近遇到一个业务场景,某次活动开始后要在250秒后自动关闭,然后修改活动的状态。考虑一下可以用传统的定时任务去处理

  • 会出现250秒时间的延时问题,比如某次任务刚刚结束,但是定时任务在前一秒就结束了,那么活动虽然结束了,那么还要再等一个定时任务才能执行,时效性不行。

针对这个业务需求,我们采用 Redis (2.8.0+版本)的订阅发布模式 ,当key过期时触发相关事件。

redis配置

Redis 配置文件的具体配置:

#
#  Example 2: to get the stream of the expired keys subscribing to channel
#  获取订阅channel的过期的key
#  channel名称: __keyevent@0__:expired 
#
notify-keyspace-events Ex
#
#  By default all notifications are disabled because most users don't need
#  this feature and the feature has some overhead. Note that if you don't
#  specify at least one of K or E, no events will be delivered.
#  默认情况下,所有通知都被禁用,因为大多数用户不需要这个功能和功能有一些开销
#  请注意,如果没有指定K或E中的至少一个,不会传送任何事件。
#
#  notify-keyspace-events ""

redis.conf 的配置如上,我也加上了相关注释。

jfinal配置

public class LmsCoreConfig extends JFinalConfig {
 
    /**
     * 启动后回调,使用异步,不然线程阻塞
     */
    public void afterJFinalStart() {
        FutureTask futureTask = new FutureTask(() -> {
            Redis.use().getJedis().subscribe(new KeyExpiredListener(), "__keyevent@0__:expired");
            return null;
        });
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        executorService.submit(futureTask);
    }

}

/**
*  监听redis key过期的监听器
*/
public class KeyExpiredListener extends JedisPubSub {
    @Override
    public void onMessage(String channel, String message) {
        // message 对应 key值
        //TODO key过期后的业务代码。
    }
}


测试

我们通过redis-cli  设置几个有过期时间的key测试一下

127.0.0.1:6379> SET test 123
OK
127.0.0.1:6379> EXPIRE test 60
(integer) 1

60秒触发KeyExpiredListener监听器

© 著作权归作者所有

冷冷gg

冷冷gg

粉丝 584
博文 125
码字总数 64261
作品 1
潍坊
UI设计师
私信 提问
加载中

评论(2)

冷冷gg
冷冷gg

引用来自“Minho”的评论

之前58到家分享的一个精确到秒的定时任务,他使用的是环状数据结构,每秒移动一个节点,250秒遍历一遍。
是的 我也看到 沈剑老师那篇文章了 。😄
Minho
Minho
之前58到家分享的一个精确到秒的定时任务,他使用的是环状数据结构,每秒移动一个节点,250秒遍历一遍。
node.js 中使用redis实现分布式事物锁

在node项目中,我们常会跑一些定时任务,比如定时发送通知、定时发送邮件等,项目部署的时候,我们往往是多机多实例部署,这就导致每个实例都会跑一次同样的任务,所以我们需要一个分布式事物...

小黎也
2018/06/09
0
0
基于 Python2.7 的日志系统 - Loglog

Loglog 采用Python2.7开发的日志系统 工作之余偶然看到网上提供的解决方案,顺便加上自己的一些想法来实现一把。 系统原理:日志提供接口远程请求的方式,项目用到了redis的队列,先请求过来...

伽利略phper
2018/04/16
0
0
审计、执行、回滚与统计 sql 系统 - IncetOps

IncetOps 基于Inception,一个审计、执行、回滚、统计sql的开源系统 Environment Python Version: 2.7 框架: Flask 依赖包: requirements.txt 依赖服务: MySQL + Redis + Passport(认证) Dem...

SaintIC
2018/08/22
0
0
Redis缓存失效机制

Redis缓存失效的故事要从EXPIRE这个命令说起,EXPIRE允许用户为某个key指定超时时间,当超过这个时间之后key对应的值会被清除,这篇文章主要在分析Redis源码的基础上站在Redis设计者的角度去...

Float_Luuu
2016/05/22
3.1K
1
阿里云服务器被挖矿病毒minerd入侵的解决方法

早晨上班像往常一样对服务器进行例行巡检,发现一台阿里云服务器的CPU的资源占用很高,到底是怎么回事呢,赶紧用top命令查看了一下,发现是一个名为minerd的进程占用了很高的CPU资源,miner...

宏伟的版图
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
10分钟前
0
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
18分钟前
0
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
30分钟前
0
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
35分钟前
3
0
Spring系列教程六:AOP详细讲解

AOP 概述 什么是 AOP AOP:全称是 Aspect Oriented Programming 即:面向切面编程。 AOP技术是对OOP技术的一种延伸,AOP是面向纵向,OOP是面向横向。简单的说它就是把我们程序重复的代码抽取...

我叫小糖主
48分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部