caffeine在項目中的實踐

情景:

在一次服務(wù)改造過程中杆烁,將一些上報性質(zhì)的業(yè)務(wù)與主業(yè)務(wù)進行剝離出來轰驳,中間需要對數(shù)據(jù)字段進行填充惠桃,會產(chǎn)生很多次的RPC塞祈,或者其他的IO操作,為了避免頻繁的RPC或者IO操作循签,從而提升整個業(yè)務(wù)的處理耗時轻掩,所以對其中的大部分數(shù)據(jù)進行緩存

方案一:

首先第一跳出來的本地緩存框架是使用guava,因為在內(nèi)部其他同事負責(zé)的模塊里面有使用這個內(nèi)存框架的業(yè)務(wù)懦底,所以上手起來比較容易唇牧,出問題起來也比較好解決罕扎;so,最初方案選擇就是基于guava去實現(xiàn)了這部分功能丐重,并且也上線了腔召,具體用法這里不做贅述,畢竟網(wǎng)上對guava的介紹還是很多扮惦,可以自行百度臀蛛;

上線后出現(xiàn)的問題:
問題1: 機器cpu使用率不高,但是load負載呈周期性變化崖蜜,每80-90分鐘就會出現(xiàn)一個突刺浊仆;(懷疑可能與緩存框架有關(guān),查詢其他的指標(biāo)例如磁盤io豫领,線程數(shù)過多等都在正常值)

問題2:對guava的一些策略使用的不夠正確抡柿,最開始使用的expireAfterWrite,導(dǎo)致刷新的時候可能會阻塞等恐;當(dāng)使用refreshAfterWrite策略時洲劣,沒有配置expireAfterWrite,就會產(chǎn)生過期的key不會被回收课蔬,因為refresh是基于get請求來刷新對應(yīng)key囱稽,同時因為加載的時候走的是同步加載會阻塞當(dāng)前的進程,影響整體性能二跋;

以上問題給予guava緩存可以通過一些復(fù)雜的改造方案去實現(xiàn)它的功能战惊,解決以上的問題,由于同事的推薦建議考慮學(xué)習(xí)下caffeine扎即,也是基于guava cache做的样傍,so,我去了解并且學(xué)習(xí)了下铺遂;

方案二:

Caffeine是基于JAVA 1.8 Version的高性能緩存庫。Caffeine提供的內(nèi)存緩存使用參考Google guava的API茎刚。Caffeine是基于Google Guava Cache設(shè)計經(jīng)驗上改進的成果襟锐;
看上以上這段文字以后,我就喜歡這個框架了膛锭,因為本人比較熟悉java1.8粮坞;
查詢github上的一些文檔以及官方性能對比;

image.png

image.png

image.png

引自文章鏈接:http://www.reibang.com/p/3434991ad075
可以看到Caffeine的性能是最高的初狰,并且相關(guān)的文檔也比較成熟莫杈;所以果斷進行改造;

使用方式有很多種奢入,但是我查詢了下缺少一些異步加載demo筝闹,所以我這樓闡述下異步加載的方式:
構(gòu)造cache

private ExecutorService commonExecutorService;

AsyncLoadingCache<String, Optional<String>>  ramCache = Caffeine.newBuilder().executor(commonExecutorService).expireAfterAccess(timeOut, TimeUnit.SECONDS)
                .refreshAfterWrite(180, TimeUnit.SECONDS).initialCapacity(16).maximumSize(500)
                .removalListener((com.github.benmanes.caffeine.cache.RemovalListener<String, Optional<String>>) (key, value, cause) -> log.info("key:[{}],value:[{}]被移除了,原因:{}", key, value,cause))
                .buildAsync(new AsyncCacheLoader<String, Optional<String>>() {
                    @Override
                    public @NonNull CompletableFuture<Optional<String>> asyncLoad(@NonNull String key, @NonNull Executor executor) {
                  
                      //記載緩存的業(yè)務(wù)方法
                        },executor);
                    }
                });
//以上是構(gòu)造了一個異步加載的本地緩存,傳入了自定義的線程池,設(shè)置了兩種策略关顷,一種是基于最后一次訪問的時間過期策略糊秆,一種是基于時間的刷新策略,
初始大小為16议双,最大為500痘番,并設(shè)置了監(jiān)聽器,打印相關(guān)日志平痰,設(shè)置異步加載策略汞舱,里面使用傳入的線程池進行加載
注意:本地緩存里如果需要放null值的話,必須用optional宗雇,否則會報錯昂芜;
其余使用方式與guava cache一致





最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逾礁,隨后出現(xiàn)的幾起案子说铃,更是在濱河造成了極大的恐慌,老刑警劉巖嘹履,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腻扇,死亡現(xiàn)場離奇詭異,居然都是意外死亡砾嫉,警方通過查閱死者的電腦和手機幼苛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焕刮,“玉大人舶沿,你說我怎么就攤上這事∨洳ⅲ” “怎么了括荡?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溉旋。 經(jīng)常有香客問我畸冲,道長,這世上最難降的妖魔是什么观腊? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任邑闲,我火速辦了婚禮,結(jié)果婚禮上梧油,老公的妹妹穿的比我還像新娘苫耸。我一直安慰自己,他們只是感情好儡陨,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布褪子。 她就那樣靜靜地躺著量淌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褐筛。 梳的紋絲不亂的頭發(fā)上类少,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音渔扎,去河邊找鬼硫狞。 笑死,一個胖子當(dāng)著我的面吹牛晃痴,可吹牛的內(nèi)容都是我干的残吩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼倘核,長吁一口氣:“原來是場噩夢啊……” “哼泣侮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起紧唱,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤活尊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漏益,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛹锰,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年绰疤,在試婚紗的時候發(fā)現(xiàn)自己被綠了铜犬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡轻庆,死狀恐怖癣猾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情余爆,我是刑警寧澤纷宇,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蛾方,受9級特大地震影響像捶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜转捕,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唆垃。 院中可真熱鬧五芝,春花似錦、人聲如沸辕万。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至醉途,卻和暖如春矾瑰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隘擎。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工殴穴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人货葬。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓采幌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親震桶。 傳聞我的和親對象是個殘疾皇子休傍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容