高并發(fā)的場景下,DB前置緩存是常用的一種解決方案。
通常做法是將從DB查詢出的值放入緩存(分布式緩存或者本地緩存都可以),下次請求時先從緩存取數(shù)據(jù),如果獲取不到,再從DB查詢;但是如果查詢結(jié)果本就為空,緩存里會落空值,這樣會導(dǎo)致請求還是全部落到DB,這時候就需要在DB放置一個空對象。
我們可以使用guava的Optional類,也可以自己定義一個實(shí)現(xiàn)了Serializable接口的result類用來存放空對象,正好最近接觸到了vavr,所以嘗試使用了一下vavr中的Option類。
部分代碼如下
public MyObject queryMyObjectById(String id) {
//根據(jù)主鍵id從緩存獲取數(shù)據(jù)
Option<MyObject> option = (Option<MyObject>)cacheManager.getObject(id);
if (option != null) {
return option.getOrNull();
} else {
MyObject myObject = myObjectDAO.queryMyObjectById(id);
//如果查詢?yōu)榭?,放入空對象,防止所有查詢?yōu)榭盏慕Y(jié)果落到DB上
cacheManager.put(id, Option.of(myObject));
return myObject;
}
}
Vavr 是Java 8+中一個函數(shù)式庫,提供了一些不可變數(shù)據(jù)類型及函數(shù)式控制結(jié)構(gòu)。
官方英文文檔鏈接
翻譯文檔鏈接