使用NullObject模式優(yōu)雅解決緩存穿透問題

緩存穿透的問題

通常使用的緩存都是應用先檢查緩存中是否存在。如果存在牢裳,則直接返回緩存叶沛;如果不存在,則查詢數(shù)據(jù)庫灰署,將結果緩存并返回。
但是查詢的是一個不存在的數(shù)據(jù)晦墙,就會造成每一次請求都查詢DB肴茄,這樣緩存就失去了意義。
為了解決這個問題抗楔,通常使用特殊字符串標記無用的緩存拦坠,比如"EmptyCache"贪婉,然后在應用層做相應處理,解決此問題。但是這種方式顯得比較粗暴:

  1. 需要在反序列化過程中莫湘,將特殊字符串排除掉,同時需要將不存在的數(shù)據(jù)標記出來腰池,避免再查詢DB。
  2. 如果需要處理不同類型的數(shù)據(jù)的緩存穿透問題,是不是多加幾種特殊字符傳示弓。

因此讳侨,我們可以引入NullObject模式來解決此問題。它的作用在于提供一個對象給指定的類型奏属,用以代替這個對象為空的情況跨跨。
更具體的信息,可以參考此鏈接:https://en.wikipedia.org/wiki/Null_object

新的方案:以券(Ticket)為例

步驟一囱皿、引入抽象類AbstractNullObject

public abstract class AbstractNullObject{
    private Integer id;
    public void markNullObject(){
        this.id = -1;
    }
    public void isNullObject(){
        return id!=null && id<0;
    }
}

一般在設計數(shù)據(jù)庫表時勇婴,都有id字段,而且id字段是自增的整數(shù)嘱腥。我們可以復用此id字段耕渴,并約定一個規(guī)則:id小0的對象,都是NullObject橱脸。

步驟二、讓Ticket繼承能夠AbstractNullObject,并添加createNullObject函數(shù)

public class Ticket extends  AbstractNullObject{
    public static Ticket createNullObject(String ticketCode){
        Ticket ticket =new Ticket();
        ticket.setTicketCode(ticketCode):
        ticket.markNullObject();
    }
}

步驟三分苇、更新緩存的查詢流程

舊流程 新流程
1. 根據(jù)TicketCodes慰技,查詢緩存,并將結果加入結果集组砚。
2. 根據(jù)TicketCodes和結果集吻商,找出不存在的TicketCode,然后到db查詢,將結果加入結果集糟红,并寫入緩存艾帐。
3. 返回結果集合。
1. 根據(jù)TicketCodes盆偿,查詢緩存柒爸,并將結果加入結果集。
2. 根據(jù)TicketCodes和結果集事扭,找出不存在的TicketCode,然后到db查詢捎稚,將結果加入結果集,并寫入緩存求橄。
3. 根據(jù)TicketCodes和結果集今野,再次不存在的TicketCode,為這些code創(chuàng)建NullObject,并寫入緩存罐农。
4. 過濾結果集条霜,剔除NullObject。
5. 返回結果集涵亏。

對比新老流程宰睡,新流程增加了步驟3蒲凶、4。
步驟3的作用:為不存在的TicketCode拆内,創(chuàng)建NullObject旋圆,寫入緩存。下次再次查詢時麸恍,緩存就有數(shù)據(jù)灵巧,DB也不會查詢。
步驟4的作用:NullObject是可以正常被反序列化或南,但對調(diào)用方來說是無效的數(shù)據(jù)孩等,需要剔除。

總結

帶來的好處:

  1. 如果想讓Sku采够,Product避免緩存穿透的問題肄方,只要繼承NullObject接口,就能復用已有的成果蹬癌。
  2. 在redis反序列化過程权她,沒有特殊處理。
  3. 在原有的查詢流程追加行為逝薪,沒有破壞性的改造隅要,成本低。

與老方案的差異:
序列化NullObject產(chǎn)生的字符串董济,攜帶的信息量遠大于特殊字符傳步清,而且反序列化后,可以判斷是否為NullObject虏肾。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廓啊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子封豪,更是在濱河造成了極大的恐慌谴轮,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吹埠,死亡現(xiàn)場離奇詭異第步,居然都是意外死亡,警方通過查閱死者的電腦和手機缘琅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門粘都,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胯杭,你說我怎么就攤上這事驯杜。” “怎么了做个?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵鸽心,是天一觀的道長。 經(jīng)常有香客問我居暖,道長顽频,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任太闺,我火速辦了婚禮糯景,結果婚禮上,老公的妹妹穿的比我還像新娘省骂。我一直安慰自己蟀淮,他們只是感情好,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布钞澳。 她就那樣靜靜地躺著怠惶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轧粟。 梳的紋絲不亂的頭發(fā)上策治,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音兰吟,去河邊找鬼通惫。 笑死,一個胖子當著我的面吹牛混蔼,可吹牛的內(nèi)容都是我干的履腋。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼惭嚣,長吁一口氣:“原來是場噩夢啊……” “哼遵湖!你這毒婦竟也來了?” 一聲冷哼從身側響起料按,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤奄侠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后载矿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垄潮,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年闷盔,在試婚紗的時候發(fā)現(xiàn)自己被綠了弯洗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡逢勾,死狀恐怖牡整,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溺拱,我是刑警寧澤逃贝,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布谣辞,位于F島的核電站,受9級特大地震影響沐扳,放射性物質(zhì)發(fā)生泄漏泥从。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一沪摄、第九天 我趴在偏房一處隱蔽的房頂上張望躯嫉。 院中可真熱鬧,春花似錦杨拐、人聲如沸祈餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆阳。三九已至,卻和暖如春奕筐,著一層夾襖步出監(jiān)牢的瞬間舱痘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工离赫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芭逝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓渊胸,卻偏偏與公主長得像旬盯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翎猛,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理胖翰,服務發(fā)現(xiàn),斷路器切厘,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法萨咳,類相關的語法,內(nèi)部類的語法疫稿,繼承相關的語法培他,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 這部分主要是開源Java EE框架方面的內(nèi)容遗座,包括Hibernate舀凛、MyBatis、Spring途蒋、Spring ...
    雜貨鋪老板閱讀 1,357評論 0 2
  • 第五章 他的真面貌 樓柒是被一陣清脆的鳥鳴叫醒的猛遍。 剛開始她有點兒迷迷糊糊不知今夕何夕,還以為自己在臭老道的道觀里...
    a63df4c3d8c0閱讀 859評論 1 1
  • 今天天氣又變冷了,不是很懂南京懊烤。 因為周末的自我評價受到了同事的鼓勵(梯醒?)所以今天就比較努力在干活,而且內(nèi)心終歸是...
    真晝之月閱讀 127評論 0 0