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