在Nodejs中使用Redis如何完成定時任務?

2021-07-24 16:07:52 字數 2042 閱讀 8594

如果在

nodesjs開發

中你的程式需要執行一些定時任務,

你會怎麼做?

之前的我是這樣做的: 1.

開啟chrom 2.

在github

中查詢關鍵字 

nodejs 

定時任務 3.

選擇star

數最高的開源專案

.....

額,是它 

node-schedule。

然後按照它的api, 

寫類似以下的**,基本就能把功能完成了

// 確定時間的任務,在

2023年10

月1日,00:00:00執行

var schedule = require("node-schedule");

var date = 

new date(2015,10,1,0,0,0);

var job = schedule.schedulejob(date, 

function());

但是,老大有一天突然說:你實現的那種方式效率太低了,網上有人用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");// 

建立乙個用於訂閱通知的

client

var subscriberclient = redis.createclient( );

function

initredissubscribe()

然後,你需要建立定時任務的地方,建立一條redis

快取,過期時間為你想執行任務的時間減去當前時刻。設定任務:

var redis = 

require("redis");// 

建立乙個用於建立任務的

client

var schedqueueclient = redis.createclient( );

function

setproducttask(key)

原理就是當快取過期是,通過之前的訂閱,我們能獲取到快取的key

值,根據

key值我們能夠執行對應的任務。

大概是這樣的:

// 當接收到訂閱訊息呼叫對應服務

subscriberclient.on("pmessage", function (pattern, channel, expiredkey)

});其中,我遇到比較大的倆個問題。 1.

就是時間不好處理,因為不能像之前使用

new date(2015,10,1,0,0,0)

這樣來設定任務的時間了, 最好用了萬能的時間庫

moment

來解決問題 2.

就是如果你要迴圈的執行任務。 做法就是你執行一次任務的時候,需要建立下一次任務的快取。

在laravel中使用redis

install composer require predis predis 配置 config database.php redis client predis default host env redis host localhost password env redis password nu...

在C 中使用Redis

vs2015版本 二 將解壓後的檔案中下面四個dll引用到專案中 三 用c 對redis來進行簡單的讀取和寫入操作 using system using system.collections.generic using system.linq using system.text using serv...

在專案中使用redis

在專案中使用redis,今天我初步學習了redis整合在j a專案中的方法,這些都是比較初級的入門知識。1.先引入相關的jar包,我這裡使用的是jedis 2.1.0.jar,通過這個jar包來連線redis的服務端。2.j a鏈結redis服務端 程式中的setup方法就是連線redis服務端的方...