Redis的過期時間和過期刪除機制

2021-10-24 15:34:17 字數 2670 閱讀 5956

有時候我們並不希望redis的key一直存在。例如快取,驗證碼等資料,我們希望它們能在一定時間內自動的被銷毀。redis提供了一些命令,能夠讓我們對key設定過期時間,並且讓key過期之後被自動刪除。

1.expire pexpire 

expire介面定義:expire key "seconds"

介面描述:設定乙個key在當前時間"seconds"(秒)之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間。

pexpire介面定義:pexpire key "milliseconds"

介面描述:設定乙個key在當前時間"milliseconds"(毫秒)之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間。

2.expireat pexpireat

expireat介面定義:expireat key "timestamp"

介面描述:設定乙個key在"timestamp"(時間戳(秒))之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間。

pexpireat介面定義:pexpireat key "milliseconds-timestamp"

介面描述:設定乙個key在"milliseconds-timestamp"(時間戳(毫秒))之後過期。返回1代表設定成功,返回0代表key不存在或者無法設定過期時間 

3.ttl pttl

ttl介面定義:ttl key

介面描述:獲取key的過期時間。如果key存在過期時間,返回剩餘生存時間(秒);如果key是永久的,返回-1;如果key不存在或者已過期,返回-2。

pttl介面定義:pttl key

介面描述:獲取key的過期時間。如果key存在過期時間,返回剩餘生存時間(毫秒);如果key是永久的,返回-1;如果key不存在或者已過期,返回-2。

4.persist

persist介面定義:persist key

介面描述:移除key的過期時間,將其轉換為永久狀態。如果返回1,代表轉換成功。如果返回0,代表key不存在或者之前就已經是永久狀態。  

5.setex

setex介面定義:setex key "seconds" "value"

介面描述:setex在邏輯上等價於set和expire合併的操作,區別之處在於setex是一條命令,而命令的執行是原子性的,所以不會出現併發問題。

redis出於效能上的考慮,無法做到對每乙個過期的key進行即時的過期監聽和刪除。但是redis提供了其它的方法來清理過期的key。

1.被動清理

當使用者主動訪問乙個過期的key時,redis會將其直接從記憶體中刪除。

2.主動清理

在redis的持久化中,我們知道redis為了保持系統的穩定性,健壯性,會週期性的執行乙個函式。在這個過程中,會進行之前已經提到過的自動的持久化操作,同時也會進行記憶體的主動清理。

在記憶體主動清理的過程中,redis採用了乙個隨機演算法來進行這個過程:簡單來說,redis會隨機的抽取n(預設100)個被設定了過期時間的key,檢查這其中已經過期的key,將其清除。同時,如果其中已經過期的key超過了一定的百分比m(預設是25),則將繼續執行一次主動清理,直至過期key的百分比在概率上降低到m一下。

3.記憶體不足時觸發主動清理

在redis的記憶體不足時,也會觸發主動清理。

redis是乙個基於記憶體的資料庫,如果儲存的資料量很大,達到了記憶體限制的最大值,將會出現記憶體不足的問題。redis允許使用者通過配置maxmemory-policy引數,指定redis在記憶體不足時的解決策略。

1.volatile-lru使用lru演算法刪除乙個鍵(只針對設定了過期時間的key

2.allkeys-lru使用lru演算法刪除乙個鍵

3.volatile-lfu使用lfu演算法刪除乙個鍵(只針對設定了過期時間的鍵)

4.allkeys-lfu使用lfu演算法刪除乙個鍵

5.volatile-random隨機刪除乙個鍵(只針對設定了過期時間的鍵)

6.allkeys-random隨機刪除乙個鍵

7.volatile-ttl刪除最早過期的乙個鍵

8.noeviction不刪除鍵,返回錯誤資訊(redis預設選項)

對於只針對設定了過期時間的鍵進行刪除的策略,在所有的可被刪除的鍵(非永久的鍵)都被刪除時記憶體依然不足,將會丟擲錯誤。

其中,lru演算法--->最近最少使用演算法,較為注重於時間;lfu演算法--->最近最不常用演算法,較為注重於被訪問頻率。redis的記憶體置換演算法和作業系統中的記憶體置換演算法類似,就不在這裡展開了。

redis的過期時間還有許多的細節值得去深入了解,例如持久化時對過期時間的處理,redis週期性的常規操作等等,只有這樣才能更準確的定位問題,解決問題。而想進一步的理解這些知識,除了仔細的思考外,最好的辦法就是通過閱讀源**,理解redis的底層執行原理。但是這一目標對於現在的我來說難度過大,希望通過不斷的學習,將來的我能夠做到這一點。

redis的過期時間設定和過期刪除機制

redis的過期時間設定和過期刪除機制 expire 將鍵的生存時間設為 ttl 秒 pexpire 將鍵的生存時間設為 ttl 毫秒 expireat 將鍵的過期時間設為 timestamp 所指定的秒數時間戳 pexpireat 將鍵的過期時間設為 timestamp 所指定的毫秒數時間戳.二 ...

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

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

redis過期時間

在redis中,可以給乙個鍵設定過期時間,等時間到了以後,該鍵會被自動刪除。這個機制經常被用來儲存驗證碼等有一定時效性的東西,資料的有效期過了以後,就會被自動刪除以節省記憶體空間。跟過期相關的命令有三個,分別是expire persist和ttl,用法如下 來看個簡單的例子 0.1 6379 set...