先說(shuō)下背景:用戶學(xué)習(xí)平臺(tái),單個(gè)課程有80課節(jié)左右,不同的用戶分配不同的營(yíng)期,不同的營(yíng)期有不同的課節(jié);為了提升用戶響應(yīng)速度對(duì)課節(jié)列表和單個(gè)課節(jié)的學(xué)習(xí)進(jìn)度數(shù)據(jù)進(jìn)行了緩存。當(dāng)課程進(jìn)行了更新時(shí),會(huì)同步把課程對(duì)應(yīng)用戶學(xué)習(xí)數(shù)據(jù)也更新。

上述方案一段時(shí)間運(yùn)行良好,相安無(wú)事。突然有一天運(yùn)營(yíng)小伙伴要調(diào)整課程相關(guān)信息,多人同時(shí)更新不同的課程信息,需要清除用戶學(xué)習(xí)緩存。
因?yàn)槭褂昧?b>Redis keys模糊查詢,導(dǎo)致阻塞I/O,導(dǎo)致無(wú)響應(yīng),對(duì)比三種方案如下:
方案1:Scan VS Keys:Scan相當(dāng)于分頁(yè)查詢,解決了長(zhǎng)時(shí)間阻塞IO,但是CPU一直高位運(yùn)作,系統(tǒng)響應(yīng)依舊很慢。
方案2:記錄所有Keys,指定刪除:可以解決長(zhǎng)時(shí)間阻塞IO和CPU高位運(yùn)作,但是侵入業(yè)務(wù)代碼,維護(hù)難度增加
方案3:通過課程版本號(hào)(時(shí)間戳等):引入版本號(hào)概念,隨機(jī)初始一個(gè)版本號(hào),每次更新增加1,作為Key的前綴,以空間換取時(shí)間。