1.設置過期時間
redis有四種命令可以用於設置鍵的生存時間和過期時間
EXPIRE <KEY> <TTL> : 將鍵的生存時間設為 ttl 秒 PEXPIRE <KEY> <TTL> :將鍵的生存時間設為 ttl 毫秒 EXPIREAT <KEY> <timestamp> :將鍵的過期時間設為 timestamp 所指定的秒數時間戳 PEXPIREAT <KEY> <timestamp>: 將鍵的過期時間設為 timestamp 所指定的毫秒數時間戳.
2.保存過期時間
那么redis里面對這些key的過期時間和生存時間的信息是怎么保存的呢?? 答:在數據庫結構redisDb中的expires字典中保存了數據庫中所有鍵的過期時間,我們稱expire這個字典為過期字典。 (1)過期字典是一個指針,指向鍵空間的某個鍵對象。 (2)過期字典的值是一個longlong類型的整數,這個整數保存了鍵所指向的數據庫鍵的過期時間–一個毫秒級的 UNIX 時間戳。
3.過期間的刪除策略
如果一個鍵是過期的,那它到了過期時間之后是不是馬上就從內存中被被刪除呢??如果不是,那過期后到底什么時候被刪除呢??
其實有三種不同的刪除策略:
(1):立即刪除。在設置鍵的過期時間時,創建一個回調事件,當過期時間達到時,由時間處理器自動執行鍵的刪除操作。
立即刪除能保證內存中數據的最大新鮮度,因為它保證過期鍵值會在過期后馬上被刪除,其所占用的內存也會隨之釋放。但是立即刪除對cpu是最不友好的。因為刪除操作會占用cpu的時間,如果剛好碰上了cpu很忙的時候,比如正在做交集或排序等計算的時候,就會給cpu造成額外的壓力。
而且目前redis事件處理器對時間事件的處理方式--無序鏈表,查找一個key的時間復雜度為O(n),所以並不適合用來處理大量的時間事件。
(2):惰性刪除。鍵過期了就過期了,不管。每次從dict字典中按key取值時,先檢查此key是否已經過期,如果過期了就刪除它,並返回nil,如果沒過期,就返回鍵值。
惰性刪除是指,某個鍵值過期后,此鍵值不會馬上被刪除,而是等到下次被使用的時候,才會被檢查到過期,此時才能得到刪除。所以惰性刪除的缺點很明顯:浪費內存。dict字典和expires字典都要保存這個鍵值的信息。
舉個例子,對於一些按時間點來更新的數據,比如log日志,過期后在很長的一段時間內可能都得不到訪問,這樣在這段時間內就要拜拜浪費這么多內存來存log。這對於性能非常依賴於內存大小的redis來說,是比較致命的。
(3):定時刪除。每隔一段時間,對expires字典進行檢查,刪除里面的過期鍵。 可以看到,第二種為被動刪除,第一種和第三種為主動刪除,且第一種實時性更高。下面對這三種刪除策略進行具體分析。
從上面分析來看,立即刪除會短時間內占用大量cpu,惰性刪除會在一段時間內浪費內存,所以定時刪除是一個折中的辦法。
定時刪除是:每隔一段時間執行一次刪除操作,並通過限制刪除操作執行的時長和頻率,來減少刪除操作對cpu的影響。另一方面定時刪除也有效的減少了因惰性刪除帶來的內存浪費。
4.redis使用的策略
redis使用的過期鍵值刪除策略是:惰性刪除加上定期刪除,兩者配合使用。
5.內存淘汰機制
問題:假設定期刪除漏掉了很多過期 key,后期也沒及時去查過期key,也就沒走惰性刪除,此時大量過期key堆積在內存里,導致redis內存塊耗盡了
使用redis內存淘汰機制解決這個問題
當前已使用內存超過maxmemory限定時,觸發內存淘汰機制
redis 內存淘汰機制(MySQL里有2000w數據,Redis中只存20w的數據,如何保證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-eviction:禁止驅逐數據,也就是說當內存不足以容納新寫入數據時,新寫入操作會報錯。這個應該沒人使用吧! 4.0版本后增加以下兩種: 7.volatile-lfu:從已設置過期時間的數據集(server.db[i].expires)中挑選最不經常使用的數據淘汰 8.allkeys-lfu:當內存不足以容納新寫入數據時,在鍵空間中,移除最不經常使用的key
