nodejs redis 發(fā)布訂閱機制封裝實現(xiàn)方法及實例代碼
nodejs redis 發(fā)布訂閱機制封裝
最近項目使用redis,對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() 將其暴漏,可保證是單例。在程序啟動時,調(diào)用
registerHandlers 注冊特定通道的處理邏輯,然后調(diào)用
subscribe 訂閱通道。
在合適時機調(diào)用publish,這個機制可以實現(xiàn)分布式下所有客戶端watch 同一個數(shù)據(jù)的更改。
本人全手工打造的dotnetcore webapi 框架,可實現(xiàn)快速開發(fā)。
地址:http://xiazai.jb51.net/201612/yuanma/WebApiCore-master(jb51.net).rar。
1 采用DDD模式開發(fā),充血模型 2 添加Dapper擴展,默認(rèn)實現(xiàn)增刪改查基本操作。利用AutoMapper 做實體轉(zhuǎn)換,減少重復(fù)勞動。 3 依賴注入融合Autofac,倉儲層和應(yīng)用層自動注入 4 實現(xiàn)JWT驗證 5 加入swagger 文檔 6 單元測試添加了xunit,MyMvc 可以方便對webapi測試 7 數(shù)據(jù)庫版本控制
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
3分鐘快速搭建nodejs本地服務(wù)器方法運行測試html/js
本篇文章主要介紹了3分鐘快速搭建nodejs本地服務(wù)器方法運行測試html/js,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
NodeJS感知和控制自身進(jìn)程的運行環(huán)境和狀態(tài)
NodeJS可以感知和控制自身進(jìn)程的運行環(huán)境和狀態(tài),也可以創(chuàng)建子進(jìn)程并與其協(xié)同工作,這使得NodeJS可以把多個程序組合在一起共同完成某項工作,并在其中充當(dāng)膠水和調(diào)度器的作用,和進(jìn)程管理相關(guān)的API單獨介紹起來比較枯燥,這里從一些典型的應(yīng)用場景出發(fā)2024-01-01
nodejs 整合kindEditor實現(xiàn)圖片上傳
這篇文章主要介紹了nodejs 整合kindEditor實現(xiàn)圖片上傳,需要的朋友可以參考下2015-02-02

