PHP 面試官問:你說說Redis的幾個過期策略?

来源:https://www.cnblogs.com/a609251438/archive/2019/11/10/11831938.html

在使用redis時,一般會設置一個過期時間,當然也有不設置過期時間的,也就是永久不過期。當設置了過期時間,redis是如何判斷是否過期,以及根據什麼策略來進行刪除的。 設置過期時間 expire key time(以秒為單位) 這是最常用的方式setex(String key, int second ...


在使用redis時,一般會設置一個過期時間,當然也有不設置過期時間的,也就是永久不過期。當設置了過期時間,redis是如何判斷是否過期,以及根據什麼策略來進行刪除的。

設置過期時間
 expire key time(以秒為單位) 這是最常用的方式
setex(String key, int seconds, String value) 字元串獨有的方式
除了字元串自己獨有設置過期時間的方法外,其他方法都需要依靠expire方法來設置時間如果沒有設置時間,那緩存就是永不過期如果設置了過期時間,之後又想讓緩存永不過期,使用persist key


三種過期策略
定時刪除
在設置key的過期時間的同時,為該key創建一個定時器,讓定時器在key的過期時間來臨時,對key進行刪除

優點:

保證記憶體被儘快釋放
缺點:

   若過期key很多,刪除這些key會占用很多的CPU時間,在CPU時間緊張的情況下,CPU不能把所有的時間用來做要緊的事兒,還需要去花時間刪除這些key
定時器的創建耗時,若為每一個設置過期時間的key創建一個定時器(將會有大量的定時器產生),性能影響嚴重
懶漢式式刪除
key過期的時候不刪除,每次通過key獲取值的時候去檢查是否過期,若過期,則刪除,返回null。

優點:

刪除操作只發生在通過key取值的時候發生,而且只刪除當前key,所以對CPU時間的占用是比較少的,而且此時的刪除是已經到了非做不可的地步(如果此時還不刪除的話,我們就會獲取到了已經過期的key了)
缺點:

若大量的key在超出超時時間後,很久一段時間內,都沒有被獲取過,那麼可能發生記憶體泄露(無用的垃圾占用了大量的記憶體)
定期刪除
每隔一段時間執行一次刪除過期key操作

優點:

    通過限制刪除操作的時長和頻率,來減少刪除操作對CPU時間的占用--處理"定時刪除"的缺點
定期刪除過期key--處理"懶漢式刪除"的缺點
缺點:

   在記憶體友好方面,不如"定時刪除"(會造成一定的記憶體占用,但是沒有懶漢式那麼占用記憶體)
在CPU時間友好方面,不如"懶漢式刪除"(會定期的去進行比較和刪除操作,cpu方面不如懶漢式,但是比定時好)
難點:

  合理設置刪除操作的執行時長(每次刪除執行多長時間)和執行頻率(每隔多長時間做一次刪除)(這個要根據伺服器運行情況來定了),每次執行時間太長,或者執行頻率太高對cpu都是一種壓力。
每次進行定期刪除操作執行之後,需要記錄遍歷迴圈到了哪個標誌位,以便下一次定期時間來時,從上次位置開始進行迴圈遍歷
說明:

    memcached只是用了惰性刪除,而redis同時使用了惰性刪除與定期刪除,這也是二者的一個不同點(可以看做是redis優於memcached的一點);
對於懶漢式刪除而言,並不是只有獲取key的時候才會檢查key是否過期,在某些設置key的方法上也會檢查(eg.setnx key2 value2:該方法類似於memcached的add方法,如果設置的key2已經存在,那麼該方法返回false,什麼都不做;如果設置的key2不存在,那麼該方法設置緩存key2-value2。假設調用此方法的時候,發現redis中已經存在了key2,但是該key2已經過期了,如果此時不執行刪除操作的話,setnx方法將會直接返回false,也就是說此時並沒有重新設置key2-value2成功,所以對於一定要在setnx執行之前,對key2進行過期檢查)。
Redis採用的過期策略
懶漢式刪除+定期刪除

懶漢式刪除流程:
在進行get或setnx等操作時,先檢查key是否過期;
若過期,刪除key,然後執行相應操作;
若沒過期,直接執行相應操作;
定期刪除流程
簡單而言,對指定個數個庫的每一個庫隨機刪除小於等於指定個數個過期key

遍歷每個資料庫(就是redis.conf中配置的"database"數量,預設為16)
檢查當前庫中的指定個數個key(預設是每個庫檢查20個key,註意相當於該迴圈執行20次,迴圈體是下邊的描述)
如果當前庫中沒有一個key設置了過期時間,直接執行下一個庫的遍歷
隨機獲取一個設置了過期時間的key,檢查該key是否過期,如果過期,刪除key
判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除。
對於定期刪除,在程式中有一個全局變數currentdb來記錄下一個將要遍歷的庫,假設有16個庫,我們這一次定期刪除遍歷了10個,那此時的currentdb就是11,下一次定期刪除就從第11個庫開始遍歷,假設currentdb等於15了,那麼之後遍歷就再從0號庫開始(此時currentdb==0)
總結
在實際中,如果我們要自己設計過期策略,在使用懶漢式刪除+定期刪除時,控制時長和頻率這個尤為關鍵,需要結合伺服器性能,已經併發量等情況進行調整,以致最佳。



您的分享是我們最大的動力!

更多相關文章
  • echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! Redis的實際被應用都是因為它的性能,在眾多緩存中Redis也是一個比較快的中間件,而且它是單線程操作, ...
  • echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! 該文章是對應前面Redis的使用,基本數據類型在SpringBoot項目的實現和使用。網上有很多的文章來描 ...
  • Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程式和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。 ...
  • 之前我們已經講解了 Nginx 的基礎內容,接下來我們開始介紹 Nginx 的架構基礎。 為什麼我們要討論 Nginx 的架構基礎? 因為 Nginx 運行在企業內網的最外層也就是邊緣節點,那麼他處理的的流量是其他應用伺服器處理流量的數倍,甚至幾個數量級,我們知道任何一種問題在不同的數量級下,他的解 ...
  • 過早的優化是萬惡之源。而在真正遇到瓶頸的時候,pprof 可以快速定位到需要優化的地方。 ...
  • 垃圾收集GC(Garbage Collection)是Java語言的核心技術之一, 在Java中,程式員不需要去關心記憶體動態分配和垃圾回收的問題,這一切都交給了JVM來處理。 一. jvm的記憶體結構 垃圾回收都是基於記憶體去回收的,因此,先要對記憶體結構有一個大概的瞭解 Java記憶體運行時區域大概分了三 ...
  • 背景 之前做的海量數據數據展示,在預處理速度和線上渲染上還有有所欠缺,本文中進行一些優化工作,使得九分鐘處理完一千多萬面數據的3 12級矢量切片,線上瀏覽數據請求時間控制在10s左右。 準備 軟體環境:PostGIS(3.0.0rc2 r17909)和 PostgreSQL( 12.0, compi ...
  • Eclipse部署多模塊項目到tomcat,啟動時找不到jar的解決方法。 ...
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...