eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 152|回复: 0
收起左侧

在 Nodejs 中使用 Redis 来完成定时任务

[复制链接]

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

65

主题

67

帖子

219

e币
发表于 2016-11-16 16:56:04 | 显示全部楼层 |阅读模式

没有eoe的账号,级别还太低,出门如何吹牛逼?

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x
如果在Nodesjs开发http://www.maiziedu.com/course/694/中你的程序需要执行一些定时任务,你会怎么做?
  之前的我是这样做的:
  1.打开chrom
  2.github中查找关键字 nodejs 定时任务
  3.选择star数最高的开源项目.....额,是它 node-schedule
  然后按照它的api, 写类似以下的代码,基本就能把功能完成了
  // 确定时间的任务,在2015101日,00:00:00执行
  var schedule = require("node-schedule");
  var date = new Date(2015,10,1,0,0,0);
  var job = schedule.scheduleJob(date, function(){
  console.log("执行任务");
  });
  但是,老大有一天突然说:你实现的那种方式效率太低了,网上有人用redis实现了定时器。你去看一看,下一版本改为那种实现方式。
  通过查询网上的资料和别人的实现方式,大概整理了如下思路。
  1.Redis 2.0.0 之后推出了 Pub / Sub 的指令,可以订阅和发送特定频道消息。
  2.Redis 2.8.0 版本之后,其推出了一个新的特性——键空间消息通知
  3.就是如果我订阅了键空间消息,那我就可以完成定时任务了。(通知订阅缓存的过期事件,获取对应的key值,使用key值来调用对应任务。 而缓存的过期时间则表示任务的具体执行时间) >.<
  下面是具体实现:
  首先你得保证你的Redis版本大于2.8.0。 如果不是的话,那本文到此结束。
  因为Redis默认是关闭键空间消息通知功能的,所以需求在配置中更改它,最好达到以下的标准就好了。
  notify-keyspace-events Ex
  接下来都是代码了:
  本次功能是基于 sails 框架完成的。
  首先,要在项目启动的时候开启一个Redis专门用来订阅键空间通知
  var redis = require("redis");// 创建一个用于订阅通知的clientvar subscriberClient = redis.createClient( );
  function initRedisSubscribe() {
  return subscriberClient.psubscribe('__keyevent@' + 1 +'__:expired');
  }
  然后,你需要创建定时任务的地方,创建一条Redis缓存,过期时间为你想执行任务的时间减去当前时刻。设置任务:
  var redis = require("redis");// 创建一个用于创建任务的clientvar schedQueueClient = redis.createClient( );function setProductTask(key) {
  return schedQueueClient.PSETEX(key, , '');
  }
  原理就是当缓存过期是,通过之前的订阅,我们能获取到缓存的key值,根据key值我们能够执行对应的任务。
  大概是这样的:
  // 当接收到订阅消息调用对应服务
  subscriberClient.on("pmessage", function (pattern, channel, expiredKey) {
  var taskname = expiredKey;
  switch(taskname)
  {
  case 'oneTask':
  return ProductTaskService[taskname].apply(this,_task);
  break;
  case 'twoTask':
  return SitemapTaskService[taskname].apply(this,_task);
  break;
  default:
  break;
  }
  });
  其中,我遇到比较大的俩个问题。
  1.就是时间不好处理,因为不能像之前使用new Date(2015,10,1,0,0,0)这样来设置任务的时间了, 最好用了万能的时间库moment来解决问题
  2.就是如果你要循环的执行任务。 做法就是你执行一次任务的时候,需要创建下一次任务的缓存。
文章来源:SegmentFault

*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2017-3-28 19:55 , Processed in 0.552185 second(s), 20 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
关闭

扫一扫 关注eoe官方微信