Redis4.0這個(gè)新特性,非常有用,你了解嗎?
我們常說(shuō)Redis是單線程的服務(wù),單線程的好處非常明顯,首先是代碼邏輯更加簡(jiǎn)單,服務(wù)更加穩(wěn)定,但同時(shí),單線程也引來(lái)一些問(wèn)題,例如做一些非常重的操作的時(shí)候,其他的任務(wù)就會(huì)受到影響,有一些非常重要的操作,其實(shí)可以多線程來(lái)做,例如進(jìn)行數(shù)據(jù)的備份,或者刪除一個(gè)非常大的字典的時(shí)候,同步做的意義并不是很大。
為了解決這個(gè)問(wèn)題,Redis還有一些異步線程進(jìn)行工作,讓Redis更加高效,我們稱之為L(zhǎng)azyfree機(jī)制。
Redis懶惰刪除Unlink命令
在Redis命令中,提供了一個(gè)新的刪除命令,Unlink。其實(shí)在現(xiàn)實(shí)生活中,這種懶惰刪除在現(xiàn)實(shí)生活中非常的常見,例如飯店晚上要打烊的時(shí)候,并不會(huì)立馬趕走店里的客人,打掃衛(wèi)生,而是現(xiàn)在門口掛出打烊的標(biāo)識(shí),然后再在里面慢慢地收拾,Redis的Unlink命令也是如此。例如我們對(duì)一個(gè)字典執(zhí)行Unlink命令的執(zhí)行步驟如下:
- 先從字典的條目中把這個(gè)key拿下
- 獲取字典總共有多少個(gè)值
- 如果個(gè)數(shù)較少,值執(zhí)行同步刪除,否則原子增加待惰性刪除的條目
- 將字典提交給惰性刪除隊(duì)列
- 返回刪除成功
Redis清空數(shù)據(jù)庫(kù)異步化
我們都知道,如果我們要把整個(gè)Redis里面所有的數(shù)據(jù)刪除的話,也是非常需要時(shí)間的,同理,Redis的刪除命令也可以進(jìn)行異步化。當(dāng)執(zhí)行刪除命令的時(shí)候,Redis會(huì)把數(shù)據(jù)庫(kù)的字典指向新的字典,然后把舊的數(shù)據(jù)提交到異步的線程進(jìn)行處理。
Redis其他異步刪除
在此之前,我們介紹過(guò)Redis的一些內(nèi)存淘汰與過(guò)期的策略。例如Redis的過(guò)期策略有主動(dòng)刪除跟被動(dòng)刪除兩種不同的策略,Redis4.0為我們提供新的配置項(xiàng),可以在在刪除的時(shí)候開啟異步刪除。這里需要注意的是,并不是開啟一個(gè)線程去不停掃描那些key過(guò)期。
總結(jié)
Redis的異步刪除,其實(shí)在我們?nèi)粘5拈_發(fā)中,也可以進(jìn)行借鑒。例如電商系統(tǒng)中,商家要給所有買過(guò)自己商品的用戶派發(fā)一張優(yōu)惠券,這個(gè)邏輯,非常地重,需要讀取用戶系統(tǒng)(例如需要讀取用戶的基本信息)、訂單系統(tǒng)(查詢用戶的訂單)、優(yōu)惠系統(tǒng)(查看優(yōu)惠券的數(shù)量跟優(yōu)惠券的詳情)、Push系統(tǒng)(推送用戶領(lǐng)到新的優(yōu)惠券了,可以查看了)等多個(gè)系統(tǒng),如果我們同步做,可能用戶點(diǎn)一次派發(fā)用券,要花好幾個(gè)小時(shí),而且可能伴隨著各種超時(shí),一般我們都是把這種需求這樣做,提供一個(gè)任務(wù)隊(duì)列,當(dāng)商家床架完任務(wù)的時(shí)候,就把任務(wù)丟到消息隊(duì)列里面,告訴商家說(shuō)任務(wù)提交成功,然后后臺(tái)再慢慢進(jìn)行優(yōu)惠券派發(fā),最后通知商家發(fā)送成功。
Redis,這個(gè)小而精的項(xiàng)目,有很多設(shè)計(jì)的思想值得學(xué)習(xí),歡迎大家關(guān)注我,共同學(xué)習(xí),共同進(jìn)步。大家的支持是我繼續(xù)嘮嗑的動(dòng)力。