今天,我和大家分享一篇關(guān)于 redis 有關(guān)過期鍵的內(nèi)容,主要有四個內(nèi)容:
雙流網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
設(shè)置鍵的生存時間或過期時間
redis 一共有 4 個命令來設(shè)置鍵的生存時間(可以存活多久)或過期時間(什么時候被刪除)
上述四種命令本質(zhì)上都是通過 pexpireat 命令來實(shí)現(xiàn)的。
例子: 127.0.0.1:6379> set a test OK 127.0.0.1:6379> EXPIRE a 5 (integer) 1 127.0.0.1:6379> get a // 距離設(shè)置生存時間命令的 5 秒內(nèi)執(zhí)行 "test" 127.0.0.1:6379> get a // 距離設(shè)置生存時間命令的 5 秒后執(zhí)行 (nil) 127.0.0.1:6379> set b 12 OK 127.0.0.1:6379> EXPIREAT b 1545569500 (integer) 1 127.0.0.1:6379> time 1) "1545569486" 2) "108616" 127.0.0.1:6379> get b // 距離設(shè)置 1545569500 所指定的秒數(shù)時間戳內(nèi)執(zhí)行 "12" 127.0.0.1:6379> time 1) "1545569506" 2) "208567" 127.0.0.1:6379> get b // 距離設(shè)置 1545569500 所指定的秒數(shù)時間戳后執(zhí)行 (nil)
如果自己不小心設(shè)置錯了過期時間,那么我們可以刪除先前的過期時間
移除過期時間
persist <key> 命令可以移除一個鍵的過期時間,舉個栗子:
127.0.0.1:6379> EXPIRE c 1000 (integer) 1 127.0.0.1:6379> ttl c // 有過期時間 (integer) 9996 127.0.0.1:6379> PERSIST c (integer) 1 127.0.0.1:6379> ttl c // 無過期時間 (integer) -1 PS:ttl 是以秒為單位,返回鍵的剩余生存時間;同理還有 pttl 命令是以毫秒為單位,返回鍵的剩余生存時間
此時,如果我們沒有移除過期時間,那么如果一個鍵過期了,那它什么時候會被刪除呢?
這個問題就會有以下三種答案了,它們分別代表三種不同的刪除策略
過期鍵的刪除策略
定時刪除
在設(shè)置鍵的過期時間的同時,創(chuàng)建一個定時器,讓定時器在鍵的過期時間來臨時,立即執(zhí)行對鍵的刪除操作。
優(yōu)點(diǎn):對內(nèi)存最友好的??梢约皶r釋放鍵所占用的內(nèi)存。
缺點(diǎn):對 CPU 不友好。特別在過期鍵比較多的情況下,刪除過期鍵會占用相當(dāng)一部分 CPU 時間。同時在內(nèi)存不緊張,CPU 緊張的情況下,將 CPU 用在刪除和當(dāng)前任務(wù)不想關(guān)的過期鍵上,無疑會對服務(wù)器響應(yīng)時間和吞吐量造成影響。
惰性刪除
放任鍵過期不管,但是每次從鍵空間中讀寫鍵時,都會檢查取得的鍵是否過期。如果過期就刪除該刪,否則就返回該鍵。(PS:鍵空間是一個保存了數(shù)據(jù)庫所有鍵值對的數(shù)據(jù)結(jié)構(gòu))
優(yōu)點(diǎn):對 CPU 最友好。只有在操作的時候進(jìn)行過期檢查,刪除的目標(biāo)僅限于當(dāng)前需要處理的鍵,不會在刪除其他無關(guān)本次操作的過期鍵上花費(fèi)任何 CPU 時間。
缺點(diǎn):對內(nèi)存不友好。這個十分容易理解了,鍵過期了,但因?yàn)橐恢睕]有被訪問到,所以一直保留著(除非手動執(zhí)行 flushdb 操來于清空當(dāng)前數(shù)據(jù)庫中的所有 key。),相當(dāng)于內(nèi)存泄漏。
定期刪除
每隔一段時間,程序就對數(shù)據(jù)庫進(jìn)行檢查,刪除里面的過期鍵。至于要刪除多少過期鍵,以及檢查多少數(shù)據(jù)庫,則有算法決定。
該策略是上述兩種策略的折中方案,需要通過實(shí)際情況,來設(shè)置刪除操作的執(zhí)行時長和頻率。
明白了過期鍵的刪除策略后,那 redis 服務(wù)器又是采用什么策略來刪除過期鍵的呢?
實(shí)際上,Redis 服務(wù)器使用的是惰性刪除和定期刪除兩種策略,通過配合使用,服務(wù)器可以很好的平衡 CPU 和內(nèi)存。
其中惰性刪除為 redis 服務(wù)器內(nèi)置策略。而定期刪除可以通過以下兩種方式設(shè)置:
RDB 對過期鍵的處理
生成 RDB 文件
程序會被數(shù)據(jù)庫中的鍵進(jìn)行檢查,過期的鍵不會被保存到新創(chuàng)建的 RDB 文件中。因此數(shù)據(jù)庫中的過期鍵不會對生成新的 RDB 文件造成影響
載入 RDB 文件
這里需要分情況說明:
AOF 對過期鍵的處理
AOF 文件寫入
當(dāng)服務(wù)器以 AOF 持久化模式運(yùn)行時,如果數(shù)據(jù)庫某個過期鍵還沒被刪除,那么 AOF 文件不會因?yàn)檫@個過期鍵而產(chǎn)生任何影響,依舊保留。
而當(dāng)過期鍵被刪除后,那么程序會向 AOF 文件追加一條 DEL 命令來顯式地記錄該鍵被刪除。
AOF 重寫
執(zhí)行 AOF 重寫過程中,也會被數(shù)據(jù)庫的鍵進(jìn)行檢查,已過期的鍵不會被保存到重寫后的 AOF 文件中。因此不會對 AOF 重寫造成影響
復(fù)制對過期鍵的處理
當(dāng)服務(wù)器運(yùn)行在復(fù)制模式下,由主服務(wù)器來控制從服務(wù)器的刪除過期鍵動作,目的是保證主從服務(wù)器數(shù)據(jù)的一致性。
那到底是怎么控制的呢?
PS:從服務(wù)器在接收到客戶端對過期鍵的讀命令時,依舊會返回該鍵對應(yīng)的值給客戶端,而不會將其刪除。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對創(chuàng)新互聯(lián)的支持。
網(wǎng)站題目:大家都應(yīng)該知道的Redis過期鍵與過期策略
鏈接分享:http://muchs.cn/article8/gddsop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、ChatGPT、網(wǎng)站改版、自適應(yīng)網(wǎng)站、微信公眾號、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)