1. 程式人生 > >Redis設定有效時間

Redis設定有效時間

一、有效時間設定:

redis對儲存值的過期處理實際上是針對該值的鍵(key)處理的,即時間的設定也是設定key的有效時間。Expires字典儲存了所有鍵的過期時間,Expires也被稱為過期欄位。 
四種處理策略

  1. EXPIRE 將key的生存時間設定為ttl秒
  2. PEXPIRE 將key的生成時間設定為ttl毫秒
  3. EXPIREAT 將key的過期時間設定為timestamp所代表的的秒數的時間戳
  4. PEXPIREAT 將key的過期時間設定為timestamp所代表的的毫秒數的時間戳

其實以上幾種處理方式都是根據PEXPIREAT來實現的,設定生存時間的時候是redis內部計算好時間之後在記憶體處理的,最終的處理都會轉向PEXPIREAT。 
1、2兩種方式是設定一個過期的時間段,就是咱們處理驗證碼最常用的策略,設定三分鐘或五分鐘後失效,把分鐘數轉換成秒或毫秒儲存到redis中。 
3、4兩種方式是指定一個過期的時間 ,比如優惠券的過期時間是某年某月某日,只是單位不一樣。

二、過期處理

過期鍵的處理就是把過期鍵刪除,這裡的操作主要是針對過期欄位處理的。 
Redis中有三種處理策略:定時刪除、惰性刪除和定期刪除。

  1. 定時刪除:在設定鍵的過期時間的時候建立一個定時器,當過期時間到的時候立馬執行刪除操作。不過這種處理方式是即時的,不管這個時間內有多少過期鍵,不管伺服器現在的執行狀況,都會立馬執行,所以對CPU不是很友好。
  2. 惰性刪除:惰性刪除策略不會在鍵過期的時候立馬刪除,而是當外部指令獲取這個鍵的時候才會主動刪除。處理過程為:接收get執行、判斷是否過期(這裡按過期判斷)、執行刪除操作、返回nil(空)。
  3. 定期刪除:定期刪除是設定一個時間間隔,每個時間段都會檢測是否有過期鍵,如果有執行刪除操作。這個概念應該很好理解。

看完上面三種策略後可以得出以下結論: 
4. 1、3為主動刪除,2為被動刪除。 
5. 1是實時執行的,對CPU不是很友好,但是這在最大程度上釋放了記憶體,所以這種方式算是一種記憶體優先優化策略。 
6. 2、3為被動刪除,所以過期鍵應該會存在一定的時間,這樣就使得過期鍵不會被立馬刪除,仍然佔用著記憶體。但是惰性刪除的時候一般是單個刪除,相對來說對CPU是友好的。 
7. 定期鍵這種刪除策略是一種讓人很蛋疼的策略,它既有避免1、2兩種策略劣勢的可能,也有同時發生1、2兩種策略劣勢的可能。如果定期刪除執行的過於頻繁就可能會演變成定時刪除,如果執行的過少就有可能造成過多過期鍵未被刪除而佔用過多記憶體,如果時間的設定不是太好,既可能佔用過多記憶體又同時對CPU產生不好的影響。所以。使用定期刪除的時候一定要把握好這個刪除的時間點。

三、主從伺服器刪除過期鍵處理

有三種:RDB持久化、AOF持久化和複製功能。

RDB: 
1. 主伺服器模式執行在載入RDB檔案時,程式會檢查檔案中的鍵,只會載入未過期的,過期的會被忽略,所以RDB模式下過期鍵不會對主伺服器產生影響。 
2. 從伺服器執行載入RDB檔案時,會載入所有鍵,包括過期和未過期。當主伺服器進行資料同步的時候,從伺服器的資料會被清空,所以RDB檔案的過期鍵一般不會對從伺服器產生影響。

AOF: 
AOF檔案不會受過期鍵的影響。如果有過期鍵未被刪除,會執行以下動作: 
客戶端請求時(過期鍵):

  1. 從資料庫充刪除被訪問的過期鍵;
  2. 追加一條DEL 命令到AOF檔案;
  3. 向執行請求的客戶端回覆nil(空)。

複製:

  1. 主伺服器刪除過期鍵之後,向從伺服器傳送一條DEL指令,告知刪除該過期鍵。
  2. 從伺服器接收到get指令的時候不會對過期鍵進行處理,只會當做未過期鍵一樣返回。(為了保持主從伺服器資料的一致性)
  3. 從伺服器只有接到主伺服器傳送的DEL指令後才會刪除過期鍵。 

參考書籍:《Redis設計與實現》黃健巨集著