redis學習6:redis內存淘汰機制

redis 設置過期時間

Redis中有個設置時間過期的功能,即對存儲在 redis 數據庫中的值可以設置一個過期時間。作爲一個緩存數據庫,這是非常實用的。如我們一般項目中的 token 或者一些登錄信息,尤其是短信驗證碼都是有時間限制的,按照傳統的數據庫處理方式,一般都是自己判斷過期,這樣無疑會嚴重影響項目性能。

我們 set key 的時候,都可以給一個 expire time,就是過期時間,通過過期時間我們可以指定這個 key 可以存活的時間。

在redis中,可以使用以下命令設置過期時間

    EXPIRE <KEY> <TTL> : 將鍵的生存時間設爲 ttl 秒  爲-1時代表永不過期
    PEXPIRE <KEY> <TTL> :將鍵的生存時間設爲 ttl 毫秒
    EXPIREAT <KEY> <timestamp> :將鍵的過期時間設爲 timestamp 所指定的秒數時間戳
    PEXPIREAT <KEY> <timestamp>: 將鍵的過期時間設爲 timestamp 所指定的毫秒數時間戳.

注:timestamp是unix時間戳,這個概念沒必要深究,只需知道通過相關工具可以把unix時間戳轉化爲一般的時間格式

redis過期時間設置相關命令

ttl key 查看指定key還有多少秒過期

persist key 移除指定key的過期時間

pttl key 同 ttl命令類似,區別在於 ttl是返回還有多少秒過期,而 pttl是返回多少毫秒

過期鍵刪除策略

當我們同時設置一百個甚至是一千個key的過期時間是一小時,那麼時間到了的時候,redis是怎麼對這些key進行刪除的呢?

定期刪除+惰性刪除。

通過名字大概就能猜出這兩個刪除方式的意思了。

  • 定期刪除:redis默認是每隔 100ms 就隨機抽取一些設置了過期時間的key,檢查其是否過期,如果過期就刪除。注意這裏是隨機抽取的。爲什麼要隨機呢?你想一想假如 redis 存了幾十萬個 key ,每隔100ms就遍歷所有的設置過期時間的 key 的話,就會給 CPU 帶來很大的負載!
  • 惰性刪除 :定期刪除可能會導致很多過期 key 到了時間並沒有被刪除掉。所以就有了惰性刪除。假如你的過期 key,靠定期刪除沒有被刪除掉,還停留在內存裏,除非你的系統去查一下那個 key,纔會被redis給刪除掉。這就是所謂的惰性刪除,也是夠懶的哈!

但是僅僅通過設置過期時間還是有問題的。我們想一下:如果定期刪除漏掉了很多過期 key,然後你也沒及時去查,也就沒走惰性刪除,此時會怎麼樣?如果大量過期key堆積在內存裏,導致redis內存塊耗盡了。怎麼解決這個問題呢?

這就引出我們的主題了,內存淘汰機制

內存淘汰機制

redis 提供 6種數據淘汰策略:

 

注:

  1. volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
  2. volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
  3. volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
  4. allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key(這個是最常用的).
  5. allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
  6. no-enviction:禁止驅逐數據,也就是說當內存不足以容納新寫入數據時,新寫入操作會報錯。這個應該沒人使用吧

LRU算法,least RecentlyUsed,最近最少使用算法。也就是說默認刪除最近最少使用的鍵。

但是一定要注意一點!redis中並不會準確的刪除所有鍵中最近最少使用的鍵,而是隨機抽取3個鍵,刪除這三個鍵中最近最少使用的鍵。

那麼3這個數字也是可以設置的,對應位置是配置文件中的maxmeory-samples.
 

 主要參考資料:https://github.com/Snailclimb/JavaGuide/blob/master/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8/Redis/Redis.md

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章