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