你應該知道的Redis過期鍵和過期策略

2021-09-07 09:28:33 字數 2920 閱讀 4872

如何設定過期鍵

如何取消設定的過期時間

過期鍵的過期策略是怎樣的

rdb、aof 和複製對過期鍵的處理又是怎樣的

redis 一共有 4 個命令來設定鍵的生存時間(可以存活多久)或過期時間(什麼時候被刪除)

上述四種命令本質上都是通過 pexpireat 命令來實現的。

例子:

127.0.0.1:6379> set a test

ok127.0.0.1:6379> expire a 5

(integer) 1

127.0.0.1:6379> get a // 距離設定生存時間命令的 5 秒內執行

"test"

127.0.0.1:6379> get a // 距離設定生存時間命令的 5 秒後執行

(nil)

127.0.0.1:6379> set b 12

ok127.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 // 距離設定 1545569500 所指定的秒數時間戳內執行

"12"

127.0.0.1:6379> time

1) "1545569506"

2) "208567"

127.0.0.1:6379> get b // 距離設定 1545569500 所指定的秒數時間戳後執行

(nil)

如果自己不小心設定錯了過期時間,那麼我們可以刪除先前的過期時間

persist 命令可以移除乙個鍵的過期時間,舉個栗子:

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 命令是以毫秒為單位,返回鍵的剩餘生存時間

此時,如果我們沒有移除過期時間,那麼如果乙個鍵過期了,那它什麼時候會被刪除呢?

這個問題就會有以下三種答案了,它們分別代表三種不同的刪除策略

優點:對記憶體最友好的。可以及時釋放鍵所占用的記憶體。

缺點:對 cpu 不友好。特別在過期鍵比較多的情況下,刪除過期鍵會占用相當一部分 cpu 時間。同時在記憶體不緊張,cpu 緊張的情況下,將 cpu 用在刪除和當前任務不想關的過期鍵上,無疑會對伺服器響應時間和吞吐量造成影響。

放任鍵過期不管,但是每次從鍵空間中讀寫鍵時,都會檢查取得的鍵是否過期。如果過期就刪除該刪,否則就返回該鍵。(ps:鍵空間是乙個儲存了資料庫所有鍵值對的資料結構)

優點:對 cpu 最友好。只有在操作的時候進行過期檢查,刪除的目標僅限於當前需要處理的鍵,不會在刪除其他無關本次操作的過期鍵上花費任何 cpu 時間。

缺點:對記憶體不友好。這個十分容易理解了,鍵過期了,但因為一直沒有被訪問到,所以一直保留著(除非手動執行 flushdb 操來於清空當前資料庫中的所有 key。),相當於記憶體洩漏。

每隔一段時間,程式就對資料庫進行檢查,刪除裡面的過期鍵。至於要刪除多少過期鍵,以及檢查多少資料庫,則有演算法決定。

該策略是上述兩種策略的折中方案,需要通過實際情況,來設定刪除操作的執行時長和頻率。

明白了過期鍵的刪除策略後,那 redis 伺服器又是採用什麼策略來刪除過期鍵的呢?

實際上,redis 伺服器使用的是惰性刪除和定期刪除兩種策略,通過配合使用,伺服器可以很好的平衡 cpu 和記憶體。

其中惰性刪除為 redis 伺服器內建策略。而定期刪除可以通過以下兩種方式設定:

配置 redis.conf 的 hz 選項,預設為10 (即 1 秒執行 10 次,值越大說明重新整理頻率越快,對 redis 效能損耗也越大)

配置 redis.conf 的 maxmemory 最大值,當已用記憶體超過 maxmemory 限定時,就會觸發主動清理策略

程式會被資料庫中的鍵進行檢查,過期的鍵不會被儲存到新建立的 rdb 檔案中。因此資料庫中的過期鍵不會對生成新的 rdb 檔案造成影響

這裡需要分情況說明:

如果伺服器以主伺服器模式執行,則在載入 rdb 檔案時,程式會對檔案中儲存的鍵進行檢查,過期鍵不會被載入到資料庫中。所以過期鍵不會對載入 rdb 檔案的主伺服器造成影響

如果伺服器以從伺服器模式執行,則在載入 rdb 檔案時,不論鍵是否過期都會被載入到資料庫中。但由於主從伺服器在進行資料同步時,從伺服器的資料會被清空。所以一般來說,過期鍵對載入 rdb 檔案的從伺服器也不會造成影響

當伺服器以 aof 持久化模式執行時,如果資料庫某個過期鍵還沒被刪除,那麼 aof 檔案不會因為這個過期鍵而產生任何影響,依舊保留。

而當過期鍵被刪除後,那麼程式會向 aof 檔案追加一條 del 命令來顯式地記錄該鍵被刪除。

執行 aof 重寫過程中,也會被資料庫的鍵進行檢查,已過期的鍵不會被儲存到重寫後的 aof 檔案中。因此不會對 aof 重寫造成影響

當伺服器執行在複製模式下,由主伺服器來控制從伺服器的刪除過期鍵動作,目的是保證主從伺服器資料的一致性。

那到底是怎麼控制的呢?

主伺服器刪除乙個過期鍵後,會向所有從伺服器傳送乙個 del 命令,告訴從伺服器刪除這個過期鍵

從伺服器接受到命令後,刪除過期鍵

ps:從伺服器在接收到客戶端對過期鍵的讀命令時,依舊會返回該鍵對應的值給客戶端,而不會將其刪除。

你應該知道的Spotlight搜尋快捷鍵

spotlight是mac os x中功能非常強大的內建搜尋引擎,通過spotlight我們不僅可以找到任何檔案和資料夾,還能把spotlight當做應用程式的快速啟動器 很多朋友都這樣用吧 如果你還沒有在mac上感受到spotlight的好處,那麼下面的11個spotlight快捷鍵可以幫你進一步...

Redis過期鍵刪除和記憶體淘汰

redis的鍵可以設定過期時間,時間一到,就會自動刪除。但是我們會不會這麼一種情景發生 會不會因為有這麼同一時刻太多的key過期,以至於忙不過來。同時因為 redis 是單執行緒的,收割的時間也會占用執行緒的處理時間,如果收割的太過於繁忙,會不會導致線上讀寫指令出現卡頓?其實關於這個鍵過期刪除我們也...

Redis 過期鍵的設定 獲取和刪除過期時間

設定過期 預設情況下鍵是沒有生存時間的,也就是永不過期,除非清空記憶體。設定的鍵的生存時間也很容易,可以通過4個命令設定 任選一即可 expire pexpire expireat pexpireat命令,這4個命令看起來不同但是背後實現原理都是一樣的。常用的其實就是expire和pexpire這兩...