Redis进阶-Redis的惰性删除
文章目錄
- Pre
 - del ------> unlink
 - FLUSHDB/FLUSHALL --> FLUSHDB ASYNC/FLUSHALL ASYNC
 - 異步隊(duì)列
 - AOF Sync
 - 擴(kuò)展閱讀
 
Pre
Redis進(jìn)階-Redis對(duì)于過(guò)期鍵的三種清除策略
我們一直說(shuō) Redis 是單線(xiàn)程的,這里的我們默認(rèn)指的都是Redis主要的工作線(xiàn)程,面向開(kāi)發(fā)的。 實(shí)際上 Redis 內(nèi)部實(shí)并不是只有一個(gè)主線(xiàn)程,它有很多個(gè)異步線(xiàn)程專(zhuān)門(mén)用來(lái)處理一些耗時(shí)的操作
del ------> unlink
刪除指令 del 會(huì)直接釋放對(duì)象的內(nèi)存,大部分情況下,這個(gè)指令非常快,沒(méi)有明顯延遲。不過(guò)如果刪除的 key 是一個(gè)非常大的對(duì)象,舉個(gè)例子一個(gè)包含幾千萬(wàn)元素的key,那么刪除操作就會(huì)導(dǎo)致單線(xiàn)程卡頓。
Redis 為了解決這個(gè)卡頓問(wèn)題,在 4.0 版本引入了 unlink 指令,它能對(duì)刪除操作進(jìn)行懶處理,丟給后臺(tái)線(xiàn)程來(lái)異步回收內(nèi)存。
192.168.18.131:8001> set artisan vv -> Redirected to slot [4009] located at 192.168.18.133:8006 OK 192.168.18.133:8006> UNLINK artisan (integer) 1 192.168.18.133:8006> UNLINK artisan (integer) 0 192.168.18.133:8006>FLUSHDB/FLUSHALL --> FLUSHDB ASYNC/FLUSHALL ASYNC
Redis 提供了 flushdb 和 flushall 指令,用來(lái)清空數(shù)據(jù)庫(kù),當(dāng)數(shù)據(jù)量很大時(shí),容易阻塞Redis。
Redis 4.0 同樣給這兩個(gè)指令也帶來(lái)了異步化,在指令后面增加 async 參數(shù)扔給后臺(tái)線(xiàn)程銷(xiāo)毀,不會(huì)阻塞當(dāng)前線(xiàn)程。
192.168.18.133:8006> FLUSHDB ASYNC OK 192.168.18.133:8006> FLUSHALL ASYNC OK 192.168.18.133:8006>異步隊(duì)列
主線(xiàn)程將對(duì)象的引用從「大樹(shù)」中摘除后,會(huì)將這個(gè) key 的內(nèi)存回收操作包裝成一個(gè)任務(wù),塞進(jìn)異步任務(wù)隊(duì)列,后臺(tái)線(xiàn)程會(huì)從這個(gè)異步隊(duì)列中取任務(wù)。
任務(wù)隊(duì)列被主線(xiàn)程和異步線(xiàn)程同時(shí)操作,所以必須是一個(gè)線(xiàn)程安全的隊(duì)列。
 不是所有的 unlink 操作都會(huì)延后處理,如果對(duì)應(yīng) key 所占用的內(nèi)存很小,延后處理就沒(méi)有必要了,這時(shí)候 Redis 會(huì)將對(duì)應(yīng)的 key 內(nèi)存立即回收,跟 del 指令一樣。
AOF Sync
Redis 需要每秒一次(可配置)同步 AOF 日志到磁盤(pán),確保消息盡量不丟失,需要調(diào)用
 sync 函數(shù),這個(gè)操作會(huì)比較耗時(shí),會(huì)導(dǎo)致主線(xiàn)程的效率下降,所以 Redis 也將這個(gè)操作移到異步線(xiàn)程來(lái)完成。
執(zhí)行 AOF Sync 操作的線(xiàn)程是一個(gè)獨(dú)立的異步線(xiàn)程,和前面的懶惰刪除線(xiàn)程不是一個(gè)線(xiàn)程,同樣它也有一個(gè)屬于自己的任務(wù)隊(duì)列,隊(duì)列里只用來(lái)存放 AOF Sync 任務(wù)
redis 4.0這次除了顯示增加unlink、flushdb async、flushall async命令之外,還增加了4個(gè)后臺(tái)刪除配置項(xiàng),分別為:
- slave-lazy-flush:slave接收完RDB文件后清空數(shù)據(jù)選項(xiàng)
 - lazyfree-lazy-eviction:內(nèi)存滿(mǎn)逐出選項(xiàng)
 - lazyfree-lazy-expire:過(guò)期key刪除選項(xiàng)
 - lazyfree-lazy-server-del:內(nèi)部刪除選項(xiàng),比如rename srckey destkey時(shí),如果destkey存在需要先刪除destkey
 
以上4個(gè)選項(xiàng)默認(rèn)為同步刪除,可以通過(guò)config set [parameter] yes打開(kāi)后臺(tái)刪除功能。
擴(kuò)展閱讀
redis4.0之lazyfree
Redis數(shù)據(jù)過(guò)期和淘汰策略詳解
總結(jié)
以上是生活随笔為你收集整理的Redis进阶-Redis的惰性删除的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: Redis进阶-Redis安全相关操作
 - 下一篇: Redis进阶-如何从海量的 key 中