nodejs redis 發(fā)布訂閱機(jī)制封裝實(shí)現(xiàn)方法及實(shí)例代碼
nodejs redis 發(fā)布訂閱機(jī)制封裝
最近項(xiàng)目使用redis,對(duì)publish 和 subscribe的使用進(jìn)行了了解,并進(jìn)行了封裝。
var config = require('../config/config');
var log = require("./loghelp");
var redis = require("redis");
function initialclient(param) {
var option={ host: config.redis.host, port: config.redis.port};
if(param)
{
option=Object.assign(option,param);
}
redis.print
let client = redis.createClient(option);
client.on("error", function(err) {
log.error(err);
});
return client;
}
/*example:
* let channel="ryan";
redis.pubSub.registerHandlers("ryan",msg=> console.log(msg));
redis.pubSub.subscribe(channel);
redis.pubSub.publish(channel,"hello from chen");*/
class PubSub
{
constructor(){
this.sub=initialclient();
this.handlers=new Map();
this.subAction=(channle,message)=>{
let actions= this.handlers.get(channle)||new Set();
for(let action of actions)
{
action(message);
}
}
this.alredyPublishs=[];
this.subConnected=false;
}
publish(channel,message)
{
let action=()=>{
let pub=initialclient();
pub.publish(channel,message);
};
if(this.subConnected===false)
{
this.alredyPublishs.push(action);
}
else
action();
}
registerHandlers(channel,action)
{
var actions=this.handlers.get(channel)||new Set();
actions.add(action);
this.handlers.set(channel,actions);
}
subscribe(channel)
{
let self=this;
this.sub.subscribe(channel,function (err,reply) {
if(err)
log.error(err);
self.subConnected=true;
for(let publish of self.alredyPublishs)
publish();
console.log(reply);
});
this.sub.on("message", function (channel, message) {
self.subAction(channel,message);
});
}
tearDown()
{
this.sub.quit();
}
}
然后通過exports.pubsub=new PubSub() 將其暴漏,可保證是單例。在程序啟動(dòng)時(shí),調(diào)用
registerHandlers 注冊(cè)特定通道的處理邏輯,然后調(diào)用
subscribe 訂閱通道。
在合適時(shí)機(jī)調(diào)用publish,這個(gè)機(jī)制可以實(shí)現(xiàn)分布式下所有客戶端watch 同一個(gè)數(shù)據(jù)的更改。
本人全手工打造的dotnetcore webapi 框架,可實(shí)現(xiàn)快速開發(fā)。
地址:http://xiazai.jb51.net/201612/yuanma/WebApiCore-master(jb51.net).rar。
1 采用DDD模式開發(fā),充血模型 2 添加Dapper擴(kuò)展,默認(rèn)實(shí)現(xiàn)增刪改查基本操作。利用AutoMapper 做實(shí)體轉(zhuǎn)換,減少重復(fù)勞動(dòng)。 3 依賴注入融合Autofac,倉(cāng)儲(chǔ)層和應(yīng)用層自動(dòng)注入 4 實(shí)現(xiàn)JWT驗(yàn)證 5 加入swagger 文檔 6 單元測(cè)試添加了xunit,MyMvc 可以方便對(duì)webapi測(cè)試 7 數(shù)據(jù)庫版本控制
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
3分鐘快速搭建nodejs本地服務(wù)器方法運(yùn)行測(cè)試html/js
本篇文章主要介紹了3分鐘快速搭建nodejs本地服務(wù)器方法運(yùn)行測(cè)試html/js,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
Node交互式的SFTP上傳實(shí)現(xiàn)過程剖析
這篇文章主要為大家介紹了Node交互式的SFTP上傳實(shí)現(xiàn)過程剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
NodeJS感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài)
NodeJS可以感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài),也可以創(chuàng)建子進(jìn)程并與其協(xié)同工作,這使得NodeJS可以把多個(gè)程序組合在一起共同完成某項(xiàng)工作,并在其中充當(dāng)膠水和調(diào)度器的作用,和進(jìn)程管理相關(guān)的API單獨(dú)介紹起來比較枯燥,這里從一些典型的應(yīng)用場(chǎng)景出發(fā)2024-01-01
Node.js系列之發(fā)起get/post請(qǐng)求(2)
這篇文章主要為大家詳細(xì)介紹了Node.js系列之發(fā)起get/post請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
nodejs 整合kindEditor實(shí)現(xiàn)圖片上傳
這篇文章主要介紹了nodejs 整合kindEditor實(shí)現(xiàn)圖片上傳,需要的朋友可以參考下2015-02-02
詳解nodejs微信公眾號(hào)開發(fā)——5.素材管理接口
這篇文章主要介紹了詳解nodejs微信公眾號(hào)開發(fā)——5.素材管理接口,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04

