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(); } }
然后通過(guò)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ù)庫(kù)版本控制
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
3分鐘快速搭建nodejs本地服務(wù)器方法運(yùn)行測(cè)試html/js
本篇文章主要介紹了3分鐘快速搭建nodejs本地服務(wù)器方法運(yùn)行測(cè)試html/js,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04Node交互式的SFTP上傳實(shí)現(xiàn)過(guò)程剖析
這篇文章主要為大家介紹了Node交互式的SFTP上傳實(shí)現(xiàn)過(guò)程剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08node.js中的fs.writeSync方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.writeSync方法使用說(shuō)明,本文介紹了fs.writeSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12NodeJS感知和控制自身進(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ú)介紹起來(lái)比較枯燥,這里從一些典型的應(yīng)用場(chǎng)景出發(fā)2024-01-01Node.js系列之發(fā)起get/post請(qǐng)求(2)
這篇文章主要為大家詳細(xì)介紹了Node.js系列之發(fā)起get/post請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08node.js中的path.resolve方法使用說(shuō)明
這篇文章主要介紹了node.js中的path.resolve方法使用說(shuō)明,本文介紹了path.resolve的方法說(shuō)明、接收參數(shù)、語(yǔ)法、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12nodejs 整合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