天天看點

java redis設定過期時間_redis系列之淘汰删除,主動被動雙管齊下式保障

java redis設定過期時間_redis系列之淘汰删除,主動被動雙管齊下式保障

redis可以針對key設定過期時間,如果到了過期時間,redis是如何讓其失效呢?redis提供了兩種讓key過期的方法,一種是主動删除,另一種被動删除。

被動删除

當讀/寫一個已經過期的key時,會觸發被動删除政策,直接删除掉這個過期key。

被動删除隻有key被操作時(如GET),REDIS才會被動檢查該key是否過期,如果過期則删除之并且傳回NIL。如果系統中存在大量的不經常通路的過期資料,會造成記憶體的浪費。

優點:被動删除對于cpu友好,不需要消耗cpu資源。

缺點:對于記憶體不友好,失效的key仍然占用記憶體。

主動删除

由于被動删除政策無法保證冷資料被及時删掉,是以Redis會定期主動淘汰一批已過期的key。采用的是貪心算法。key的定期删除會在Redis的周期性執行任務預設每100ms(可以通過hz參數自定義)執行一次,針對每個db,每次循環随機選擇20個key判斷是否過期,如果一輪所選的key少于25%過期,則終止此次任務。如果超過25%則繼續新的一輪選擇,如果此次任務超過一定的時間也會被終止,避免長時間消耗cpu,造成性能損耗。

優點:主動删除對于記憶體友好,能夠定期删除一些失效的key,釋放記憶體空間

缺點:對于cpu不友好,需要消耗cpu資源

注意:hz調大将會提高Redis主動淘汰的頻率,如果你的Redis存儲中包含很多冷資料占用記憶體過大的話,可以考慮将這個值調大,但Redis作者建議這個值不要超過100。我們實際線上将這個值調大到100,觀察到CPU會增加2%左右,但對冷資料的記憶體釋放速度确實有明顯的提高。

如果redis配置了主從,這兩種删除,隻會在master中執行,然後通過del key的方式同步到slave。

java redis設定過期時間_redis系列之淘汰删除,主動被動雙管齊下式保障
淘汰政策

如果失效的key沒有被通路,也未被主動删除随機選中,那這個key就永遠不會失效嗎?

redis中有一個maxmemory配置,即redis最大能使用的記憶體,當redis的使用記憶體達到這個值,會根據配置的淘汰政策,對redis的key進行淘汰。

  • volatile-lru:隻對設定了過期時間的key進行LRU(預設值)
  • allkeys-lru : 删除lru算法的key
  • volatile-random:随機删除即将過期key
  • allkeys-random:随機删除
  • volatile-ttl : 删除即将過期的
  • noeviction : 永不過期,傳回錯誤

注意:當mem_used記憶體已經超過maxmemory的設定,對于所有的讀寫請求,都會觸發redis.c/freeMemoryIfNeeded(void)函數以清理超出的記憶體。注意這個清理過程是阻塞的,直到清理出足夠的記憶體空間。是以如果在達到maxmemory并且調用方還在不斷寫入的情況下,可能會反複觸發主動清理政策,導緻請求會有一定的延遲。

主動和被動都是為了提供更多的保障。很多場景都可以使用,如資料之間的同步,資料庫mysql和redis的資料同步,主動的方式通過消息隊列,通知redis更新,被動的方式使用定時任務,定期全量同步,進而達到資料的一緻性。因為通過消息隊列,可能會存在消息的阻塞、消息中間件服務不work,消息丢失等異常情況。攜程開源架構配置中心apollo,也采用了主動和被動通知的兩種方式,主動的方式是config-server和用戶端保持長連接配接,一旦配置發生修改通知用戶端,被動方式是用戶端定時去向config-server拉取最新的配置。中心思想就是保證服務的高可用,降低出錯機率。

java redis設定過期時間_redis系列之淘汰删除,主動被動雙管齊下式保障
推薦閱讀

  • java設計模式之工廠模式
  • java設計模式之備忘錄模式,世上真的有“後悔藥”,帶你穿越回過去
  • java設計模式之中介者模式,一箭雙”雕“式二道販子
  • java設計模式之通路者模式,“見人說人話,見鬼說鬼話”
  • java設計模式之原型模式,本故事純屬虛構,如有雷同,純屬巧合
  • java設計模式之橋接模式,政策模式旗艦版,世界沒有免費的午餐
  • java設計模式之代理模式,看我72變
  • java設計模式之構模組化式,私人訂制自己的創意
  • java設計模式之狀态模式,政策模式的孿生兄弟
  • java設計模式之疊代器模式,顧客永遠的上帝
  • java設計模式之模闆模式,站在巨人的肩膀上成功
  • java設計模式之擴充卡模式,大丈夫能屈能伸
  • Head First 設計模式之指令模式,各司其職提高效率
  • Head First 設計模式之裝飾器模式,因為參與,是以認同
  • Head First 設計模式之單例模式,每個人都是唯一
  • Head First 設計模式之觀察者模式,你我都是釋出者和訂閱者
  • Head first 設計模式之政策模式,來源于生活,用之于生活
更多文章:
  • 15年經驗的老兵推薦書單,高手是這樣煉成的,你讀了幾本?
  • 應用監控系列之誰開發誰運作誰監控
  • java應用監控之調用鍊跟蹤選型之Zipkin、Pinpoint、SkyWalking、CAT
  • java應用監控之CAT簡介
  • java應用監控之CAT安裝部署
  • java應用監控之Cat背景核心功能簡介
  • java應用監控之Cat內建Dubbo、Mybatis、Logback、spring boot
java redis設定過期時間_redis系列之淘汰删除,主動被動雙管齊下式保障
java redis設定過期時間_redis系列之淘汰删除,主動被動雙管齊下式保障