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