redis作為乙個記憶體級資料庫,資料都在記憶體中,我們可以通過ttl指令來檢視資料的狀態:
注意:redis中,執行完刪除操作後,並不會馬上把資料給刪除,這要看具體的刪除策略。
對於我們使用expire
、expireat
、setex
這些操作新增的資料,除了在記憶體中給他們儲存資料外,還會有乙個額外的hash結構,這個hash結構叫expires(如果redis有16個庫的話,就會有16個expires,乙個對應乙個庫),專門用來存有時效性資料的相關資訊,那這個hash存的是個什麼東西呢?它裡面以資料的位址作為key,用它對應的過期時間作為value。
建立乙個定時器,如果乙個key有設定過期時間,而且已經到過期時間的話,定時器就對這個key執行刪除操作。
資料過期後,不做處理,當下次訪問該資料時再刪除資料。在執行get
操作時,會先執行乙個expireifneeded()
方法,來判斷這個資料是否過期,如果過期就刪除。
定期刪除時前面兩種方案的乙個折中方案,既不會有太多的cpu占用,也不會有太多的記憶體占用。在了解這個策略之前,我們先看一下redis裡的乙個資訊:server.hz。
這個server.hz是什麼呢?這個就是我們定期刪除策略裡的乙個引數,用來描述在1s內,執行多少次定期刪除,這個值預設是10。
每次執行定期刪除時,都會走乙個方法:servercron()
,這個方法代表對資料庫做乙個輪詢,這裡順便提一嘴,redis的資料庫預設有16個,當然這個也可以通過配置檔案來修改。那在這個方法裡做什麼事情呢,會執行databasecron()
,也就是去輪詢每乙個資料,從0到15,對於每乙個資料,都會有乙個activeexpirecycle()
方法,這個方法我們好好說道說道。
關於activeexpirecycle()
方法,就是對每乙個資料庫的expires區域逐一檢測,每次執行時間為250ms/server.hz,也就是說,在一秒鐘內,定期刪除占用的時間為1/4秒。
在對每個expires檢測時,會在其中隨機去w個key去檢查:
其中,w的取值在配置檔案中可以配置:active_expire_cycle_lookups_per_loop。
此外還有乙個引數:current_db,這個會用來記錄下乙個要輪詢的資料庫,如果本次activeexpirecycle()
的時間到了,下一次就從current_db記錄的資料庫開始。
特點:
定時刪除:
惰性刪除:
定期刪除:
目前redis用到的策略是:惰性刪除 + 定期刪除。
Redis學習(十五)Redis刪除策略
刪除的是過期資料,設定期限且時間已經到期的資料 ttl key結果 如果我們監控每一條資料的時間到期,這樣的守護程序會占用cpu使redis的效能下降,如果我們不處理過期資料,也會導致資料過多占用記憶體導致redis將記憶體撐爆宕機,所以刪除策略的目標並不是要完全的刪除過期資料,而是在刪除過期資料和...
Redis刪除策略
目錄 1.過期資料 2.資料刪除策略 2.1 定時刪除 2.2 惰性刪除 2.3 定期刪除 2.4 三種資料刪除策略對比 3.逐出演算法 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 對於過期資料,redis內部是否真正釋放了其記憶體空間?目標...
Redis 刪除策略
redis中的資料特徵 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 資料刪除策略 定時刪除 惰性刪除 定期刪除 資料刪除策略 資料刪除策略的目標 在記憶體占用與cpu占用之間尋找一種平衡,顧此失彼都會造成整體redis效能的下降,甚至引發伺服...