我們已經了解到了redis是一種記憶體資料庫,redis中資料都是以key-value的形式儲存在記憶體中。由redisserver來維護和管理這部分記憶體,記憶體是何足珍貴,不須要的資料或者是已經使用過的無用的資料是不會讓它長久的存在於記憶體中的,畢竟我們還是要建設節約型社會的。所以我們能夠通過給鍵設定生存時間或者過期時間來權衡有限的記憶體和不斷增長的資料。設定過期時間的命令為:【expire key 時間長度(秒)】或者是【pexpire key 時間長度(毫秒)】 同一時候也能夠通過【expireat key 時間點(unix時間戳)】,能夠通過ttl命令或者是pttl命令檢視這個鍵還有多少剩餘時間。
資料庫中鍵的過期時間是儲存在乙個字典中的,這在redis_字典中提到過了,本文主要說明的問題是過期鍵刪除的問題。乙個過期的鍵肯定不會讓它長久的再存在於記憶體中,肯定是要對它進行刪除的。建設節約型社會嘛,那麼什麼時候刪除它呢?這裡有三種不同的刪除策略。我們逐一簡單說明,非常easy理解。
1,定時刪除
什麼是定時刪除?顧名思義。就是我定個時間,到點就刪除,有什麼優點呢,對記憶體是最友好的,能夠保證過期鍵會被盡快的刪除掉,記憶體被盡早的釋放出來,可是硬幣都有兩面啊,記憶體友好了,cup時間呢。到點就刪除到點就刪除,cup不幹別的事了,光做刪除過期鍵操作了,不現實,而且server還要建立大量的定時器,來實現定時刪除。假設記憶體如今並不缺少,有空暇的記憶體,而這個時候有大量的命令請求在等待server處理,那麼server也應該優先把cup時間給處理client請求上。而不是刪除過期鍵上。
所以定時刪除不是乙個完美的策略。
2。懶惰刪除
相同,什麼是懶惰刪除。懶惰,懶得做刪除操作,逼不得已我是不會去刪除過期鍵的,懶到家了。
那麼什麼時候是逼不得已的時候呢,client如今取這個資料了。這個key已經過期了。明顯不能返回給client。這個時候也就是懶到家的時候了。不刪不行啊,client那邊不願意啊,能夠看出。這個策略對記憶體是極不好的,沒有建設節約型社會,可是cup時間是最友好的,不會輕易動用cup時間去刪除過期鍵。
3,定期刪除
定期?比定時時間長一點,不會時刻的去檢查過期鍵。刪除過期鍵,定期刪除。是每隔一段時間檢查一次資料庫。刪除裡面的過期鍵,非常明顯定期刪除是定時刪除和懶惰刪除的乙個折中。
那麼redis中採用什麼過期刪除策略呢?
redis時間上採用了惰性刪除和定期刪除兩種策略配合使用,能夠更好的使cup時間和記憶體區的平衡
本文討論redis的過期鍵刪除策略就不能不提aof和rdb兩種備份策略對過期鍵的處理
首先說一下rdb
我們知道server啟動的時候假設開啟了rdb功能,server會對rdb檔案進行載入
這裡分兩種情況
1,主server模式,會被檔案裡的鍵進行檢查,過期的鍵忽略,所以過期鍵對主server不會造成影響,
2,從server模式,不管過期只是期所有載入資料庫中,只是主server在進行資料同步的時候,從server的資料會被清空,所以一般來說,對從server來說也不會造成影響
然後是aof
記住一點,在執行aof重寫的時候,過期鍵不會被儲存到重寫後的aof檔案裡,所以過期鍵不會對aof造成影響。
還有就是主從複製的時候
主刪除乙個過期鍵,會顯示的告訴從
從在執行client傳送的讀命令時,即使是過期鍵也不會刪除過期鍵,而是像處理未過期鍵一樣處理。從僅僅有介紹到主的del命令才會刪除
Redis 過期鍵刪除策略
當redis伺服器中的資料庫鍵超過過期時間,刪除策略主要為三種 惰性刪除 放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,過期的話,刪除該鍵 如果沒有過期,就返回該鍵。定期刪除 每隔一段時間,程式就對資料庫進行一次檢查,刪除裡面的過期鍵。至於要刪除多少過期鍵,以及要檢查多少個資料...
redis過期鍵刪除策略
redis伺服器實際使用的過期鍵刪除策略有兩種 通過配合使用這兩種刪除策略,伺服器可以很好地合理使用cpu時間和避免浪費記憶體空間之間取得平衡。redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。從過期字典中隨機 20 個 key 刪除這 ...
Redis的過期鍵刪除策略
對於redis伺服器來說,記憶體資源非常寶貴,如果一些過期鍵一直不被刪除,就會造成資源浪費,因此我們需要考慮乙個問題 如果乙個鍵過期了,它什麼時候會被刪除呢?常見的刪除策略有以下3種 惰性刪除 放任過期鍵不管,每次從鍵空間中獲取鍵時,檢查該鍵是否過期,如果過期,就刪除該鍵,如果沒有過期,就返回該鍵。...