利用zookeeper即時(shí)更新本地緩存

本地緩存

當(dāng)系統(tǒng)中需要有一些基礎(chǔ)數(shù)據(jù)時(shí),往往會使用本地緩存將這些數(shù)據(jù)緩存在內(nèi)存中,以減少對數(shù)據(jù)庫的查詢,提升系統(tǒng)性能,但是本地緩存如何處理數(shù)據(jù)更新的情況呢?當(dāng)應(yīng)用集群中某臺機(jī)器更新了數(shù)據(jù),其它機(jī)器如何快速響應(yīng)?

一般更新本地緩存有如下 方式:

  • 定時(shí)更新,這種方式延遲比較大
  • 通過消息廣播機(jī)制更新
  • 使用協(xié)調(diào)者,比如zookeeper,適用于更新頻率低的場景

本文介紹第三種方式,如何利用zookeeper做緩存的即時(shí)更新

基本思路

假設(shè)應(yīng)用有三臺機(jī)器,分別標(biāo)記為A\B\C,整個(gè)過程遵循如下邏輯:

  • 應(yīng)用在創(chuàng)建本地緩存時(shí),向zookeeper注冊一個(gè)節(jié)點(diǎn)
  • 注冊監(jiān)聽器,監(jiān)聽數(shù)據(jù)變化
  • 當(dāng)其中一臺機(jī)器更新緩存后(假設(shè)是機(jī)器A),修改zookeeper上的節(jié)點(diǎn)的數(shù)據(jù),標(biāo)識有緩存更新
  • 集群中所有機(jī)器都會收到節(jié)點(diǎn)數(shù)據(jù)更新的回調(diào),隨后刷新緩存

整體邏輯如下圖:

image

實(shí)現(xiàn)

將實(shí)現(xiàn)分為兩部分,第一部分基于zk實(shí)現(xiàn)一個(gè)可復(fù)用的通知服務(wù),用于通知集群中的其它機(jī)器,第二部分基于通知服務(wù)實(shí)現(xiàn)對緩存的封裝

通知服務(wù)

通知服務(wù)抽象出一個(gè)資源的概念,用String表示資源Id,一個(gè)資源Id對應(yīng)于zookeeper上的一個(gè)節(jié)點(diǎn),針對資源id觸發(fā)通知服務(wù)實(shí)際上就是修改資源id對應(yīng)的節(jié)點(diǎn)上的數(shù)據(jù),接口如下:

image

接口定義中包含三個(gè)方法:

  • Register:注冊資源
  • Unregister:刪除資源
  • Notify:通知,目前只接受String類型的值
image

緩存封裝

因?yàn)楸镜鼐彺嬗卸喾N實(shí)現(xiàn)方式:

  • Guava
  • ConcurrentHashMap
  • 其它…

為了支持各種類型的local cache實(shí)現(xiàn),定義CacheProvider接口,用于創(chuàng)建緩存:

image

為zookeeper提供抽象類的支持:

image

不同的local cache實(shí)現(xiàn)從此abstract類繼承,例如guava的實(shí)現(xiàn):

image

基于ConcurrentHashMap的local cache實(shí)現(xiàn):

image

最后通過一個(gè)工具類提供的工廠方法來使用:

image

使用方式

最后看一下使用方式:

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容