如下爲我的想法,若是有說的不對的地方請各位大佬見諒!html
這是博主的第一篇博客,可能排版以及一些描述有不合理的地方還請勿噴,但願你們儘量的多給我這樣的新人一些鼓勵讓我能在寫博客的道路上走下去。java
進入正題,首先開發背景緩存
近期公司的一些項目上出現了內存溢出的問題,究其緣由是緩存的數據量太大致使jvm內存溢出,產品的架構上比較老因此針對緩存這塊,領導叫我去重構移植到Redis中,博主以前並無學習過Redis以及關於分佈式系統的併發問題,因此也是對個人一次挑戰,還好沒有辜負領導的指望在指望時間以前完成了任務,廢話很少說,下面講講我對Redis發佈訂閱以及實現應用集羣的分佈式鎖。tomcat
利用Redis的發佈訂閱實現各個tomcat的消息通知架構
首先了解一下Redis的發佈與訂閱,Redis的發佈訂閱是基於Redis的組成架構 :Redis Client和Redis Server,具體關於Redis發佈訂閱的信息請查閱這裏,利用Redis的該特性,只要將Redis單點同時設置爲訂閱者與發佈者,那麼當有一個tomcat發送消息給Redis,Redis去發佈該消息時就會通知到全部的節點,這樣就實現了各個節點間的消息通知併發
下圖大概描述一下整個消息的傳遞。jvm
至於實現,博主使用的是java,繼承JedisPubSub類重寫它的onSubscribe、onUnsubscribe、onMessage三個方法實現訂閱者類,再利用jedis.publish()去發佈信息。分佈式
整個過程當中須要注意的是,再發布消息後執行的動做必須放在onMessage中,不能放在發佈消息的過程當中,由於一個節點去發佈消息後,Redis還會反向通知到這個節點,若是在發佈消息的過程當中執行動做會致使該節點的動做重複執行,因此整個過程能夠分爲兩個部分第一是去發佈消息不作任何其餘多餘動做,二是接收消息當即去執行對應動做。學習
須要注意的是Redis的發佈訂閱不會作持久化因此若是在發佈信息時Redis宕機會致使消息丟失而且沒法恢復,若是業務場景中丟失消息會致使嚴重結果請慎用!spa
感謝
其實在本次的項目中還有許多關於Redis以及分佈式鎖的體會,在後面也會寫出來供你們參考一下,感謝各位看到這裏的讀者!