<del id="nnjnj"></del><track id="nnjnj"></track>

<p id="nnjnj"></p>

<address id="nnjnj"></address>

    <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

      <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>

      • 自動秒收錄
      • 軟件:1973
      • 資訊:57811|
      • 收錄網站:279872|

      IT精英團

      Redis過期的數據會被立即刪除嗎?

      Redis過期的數據會被立即刪除嗎?

      瀏覽次數:
      評論次數:
      編輯: 樂詠
      信息來源: ITPUB
      更新日期: 2022-04-24 21:20:02
      摘要

      本文來源碼哥字節(ID:MageByte)?碼哥,當key達到過期時間,Redis就會馬上刪除么?先說結論:并不會立馬刪除。Redis有兩種刪除過期數據的策略:定期選取部分數據刪除;惰性刪除;

      • 正文開始
      • 相關閱讀
      • 推薦作品

      本文來自源碼兄弟字節(ID: Magebyte)

      兄弟,密鑰到了過期時間,Redis會馬上刪除嗎?

      讓我們從結論開始:并不會立馬刪除。Redis 有兩種刪除過期數據的策略:.

      選擇一些要定期刪除的數據;

      懶刪;

      這個命令在Redis版中,到期時間不是很精確。它可能在0到1秒之間。

      從Redis 2.6開始,到期誤差為0到1毫秒。

      EXPIRE key seconds [NX | XX | GT | LT]指令可以設置指定密鑰的過期時間。如果沒有設置過期時間,那么這個鍵將一直存在,除非我們顯式地刪除它,比如執行DEL指令。

      俗話說“狡兔死,走狗烹”,沒用的話和35歲“畢業”是一樣的。

      多么恐慌啊.

      Redis 7 . 0 . 0版以來:EXPIRE增加了選項:NX,XX和GT,LT選項。

      NX:設置密鑰未過期時的過期時間;

      XX:僅在密鑰過期時設置過期時間;

      GT:僅在新的到期時間大于當前到期時間時設置到期時間;

      LT:僅當新的到期時間小于當前到期時間時,才設置為到期時間。

      過期與持久化

      或者在主從集群架構下,兩臺機器的時鐘嚴重不同步。有什么問題?

      過期的密鑰信息由Unix 絕對時間戳.表示

      為了讓過期操作正常運行,機器之間的時間必須保證穩定同步,否則就會出現過期時間不準的情況。

      例如,當兩臺時鐘嚴重不同步的機器之間發生RDB傳輸時,從機的時間被設置為未來的2000秒。如果主設備的一個密鑰被設置為存活1000秒,當從設備加載RDB時,該密鑰將認為該密鑰過期(因為從設備的機器時間被設置為未來的2000 s),而不會等待1000 s才過期。

      機器時鐘不同步導致過期混淆。

      惰性刪除

      慣性刪除很簡單,就是當客戶端請求查詢密鑰時,檢查密鑰是否過期,如果過期,則刪除密鑰。

      比如Redis收到客戶端的GET movie : Ozawa # ma…Leah . rmvb的請求時,會先檢查key=movie : Ozawa # ma…Leah . rmvb是否過期,如果過期就刪除。

      刪除過期數據的主動權交給了每次訪問請求。

      該實現是通過所說明的函數來實現的,

      源碼路徑:src/db.c。

      int expireIfNeeded(redisDb *db, robj *key, int force_delete_expired) {
         // key 沒有過期,return 
          if (!keyIsExpired(db,key)) return ;
          if (server.masterhost != NULL) {
              if (server.current_client == server.master) return ;
              if (!force_delete_expired) return 1;
          }

          if (checkClientPauseTimeoutAndReturnIfPaused()) return 1;

          /* Delete the key */
          deleteExpiredKeyAndPropagate(db,key);
          return 1;
      }

      定期刪除

      僅僅靠客戶端訪問來判斷 key 是否過期才執行刪除肯定不夠,因為有的 key 過期了,但未來再也沒人訪問,這些數據要怎么刪除呢?

      不能讓這些數據「占著茅坑不拉屎」。

      所謂定期刪除,也就是 Redis 默認每 1 秒運行 10 次(每 100 ms 執行一次),每次隨機抽取一些設置了過期時間的 key,檢查是否過期,如果發現過期了就直接刪除。

      注意:并不是一次運行就檢查所有的庫,所有的鍵,而是隨機檢查一定數量的鍵。

      具體步驟如下:

      定時刪除
      1. 從所有設置了過期時間的 key 集合中隨機選擇 20 個 key;
      2. 刪除「步驟 1」發現的所有過期 key 數據;
      3. 「步驟 2 」結束,過期的 key 超過 25%,則繼續執行「步驟 1」。

      刪除的源碼 expire.c 的 activeExpireCycle 函數實現。

      這也就意味著在任何時候,過期 key 的最大數量等于每秒最大寫入操作量除以 4。

      ?

      為啥不檢查所有設置過期時間的 key?

      你想呀,假設 Redis 里存放了 100 w 個 key,都設置了過期時間,每隔 100 毫秒就檢查 100 w 個 key,CPU 全浪費在檢查過期 key 上了,Redis 也就廢了。

      注意了:不管是定時刪除,還是惰性刪除。當數據刪除后,master 會生成刪除的指令記錄到 AOF 和 slave 節點。

      ?

      碼哥,如果過期的數據太多,定時刪除無法刪除完全(每次刪除完過期的 key 還是超過 25%),同時這些 key 也再也不會被客戶端請求,也就是無法走惰性刪除,會怎樣?

      會不會導致 Redis 內存耗盡,怎么破?

      這個問題問得好,答案是走內存淘汰機制。

      今天就到這里,說太多的話,大家容易在知識的海量里嗆死,保命要緊,至于內存淘汰機制詳情,請看下回分解。

      <END>



      標簽:時間 數據 惰性
      教你如何在Linux中生成復雜的密碼 并檢查密碼強度
      ? 上一篇 2022-04-24
      阿帕奇建筑師遵循的30條設計原則
      下一篇 ? 2022-04-24
      • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
        0閱讀 0條評論 個贊
        在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
      • 國產核心板全志T507助力消防系統升級
        0閱讀 0條評論 個贊
        9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 深入了解美團葉子發射器開源方案
        0閱讀 0條評論 個贊
        大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出……
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • 二戰MySQL數據庫【升華】
        0閱讀 0條評論 個贊
        MYSQL入門系列——第二篇1.篩選條件:(1)比較運算符:(2)邏輯運算符:(3)其他操作:1.排序:2.限制:拓展:3.去重:4.模糊查詢:(like'%')5.范圍查詢:2.聚合與分組(重點……
      • 談談我是如何學習SQL Server的
        0閱讀 0條評論 個贊
        談談我是如何學習SQLServer的相信很多人都想做大牛,但是你們知道這些大牛是怎樣煉成的嗎?我的一個同事做了差不多10年的.NET開發,算得上是大牛了吧?如果他遇到他熟悉的項目很快就能手到拿來,立……
      • [設計模式] Java設計模式-工廠模式
        3閱讀 0條評論 個贊
        目錄【設計模式】Java設計模式-工廠模式簡介1、普通工廠(SimpleFactory)模式①、定義類②、定義簡單的工廠類③、實例2、抽象工廠(AbstractFactory)模式①、定義類②、……
      • RDD星火基金簡介(01)
        0閱讀 0條評論 個贊
        1,基本概念RDD(ResilientDistributedDataset):彈性分布式數據集它是Spark中最基本的數據抽象,是編寫Spark程序的基礎。簡單的來講,一個Spark程序可以概括……
      • Java內存區(運行時數據區)簡介
        0閱讀 0條評論 個贊
        Java虛擬機在執行Java程序的過程中會把它管理的內存劃分成若干個不同的數據區域。JDK1.8和之前的版本略有不同。下圖是JDK1.8對JVM做的改動,把方法區的具體實現----元空……
      • 深入了解春季交易:介紹 使用 原則
        8閱讀 0條評論 個贊
        大家好,我是樹哥。Spring事務是復雜一致性業務必備的知識點,掌握好Spring事務可以讓我們寫出更好地代碼。這篇文章我們將介紹Spring事務的誕生背景,從而讓我們可以更清晰地了解Sp……
      • SQL Server復制:事務發布
        0閱讀 0條評論 個贊
        一、背景在復制的運用場景中,事務發布是使用最為廣泛的,我遇到這樣一個場景:在Task數據庫中有Basic與Group兩個表,需要提供這兩個表的部分字段給其它程序讀取放入緩存,程序需要比較及時的獲取……
      • 基于 網絡6的輕量級Webapi框架緊固點
        0閱讀 0條評論 個贊
        大家好,我是等天黑。FastEndpoints是一個基于.NET6開發的開源webapi框架,它可以很好地替代.NETMinimalAPIs和MVC,專門為開發效率而生,帶來了全……
      • spring接口有多個實現類 應該給哪個注入這個依賴?
        0閱讀 0條評論 個贊
        一、問題的描述在實際的系統應用開發中我經常會遇到這樣的一類需求,相信大家在工作中也會經常遇到:同一個系統在多個省份部署。一個業務在北京是一種實現方式,是基于北京用戶的需求。同樣的業務在上海是另外一種實……
      • 人人都能讀懂的源代碼——那些關于DOM的常見鉤子包(二)
        0閱讀 0條評論 個贊
        本文是深入淺出ahooks源碼系列文章的第十五篇,該系列已整理成文檔-地址。覺得還不錯,給個star支持一下哈,Thanks。本篇接著針對關于DOM的各個Hook封裝進行解讀。useFul……
      • 強大的多云混合多K8S集群管理平臺Rancher入門級實戰
        0閱讀 0條評論 個贊
        目錄概述定義為何使用其他產品安裝簡述規劃基礎環境Docker安裝Rancher安裝創建用戶創建集群添加Node節點配置kubectl創建項目和名稱空間發布應用偏好設置概述定義Rancher官網htt……
      • SQL Server批量完整備份
        0閱讀 0條評論 個贊
        一.本文所涉及的內容(Contents)本文所涉及的內容(Contents)背景(Contexts)實現代碼(SQLCodes)實現方式一(One)實現方式二(Two)實現方式三(Three)參考文……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 新零售SaaS架構:商品系統架構設計
        0閱讀 0條評論 個贊
        SaaS產品就像一座冰山,冰山以上的部分是功能、數據(可見部分)、用戶界面,冰山以下是系統架構、完整的數據模型、開放體系、非功能性需求(擴展性、可維護性、性能、安全等)。短期內想要快速上線產品,可能只……
      • 數據庫發展史II-數據倉庫
        6閱讀 0條評論 個贊
        回顧數據倉庫的發展歷程,大致可以將其分為幾個階段:萌芽探索到全企業集成時代、企業數據集成時代、混亂時代--"數據倉庫之父"間的論戰、理論模型確認時代以及數據倉庫產品百家爭鳴時代。數據倉庫理論發展歷程上……
      • 設計模式介紹——單一模式
        0閱讀 0條評論 個贊
        簡介一個類只允許創建一個對象(或實例),那么這個類就是一個單例類,這種設計模式稱作單例設計模式(SingletonDesignPattern),簡稱單例模式。單例模式保證系統內存中只存在一個對象,……
      • Java開源數據庫引擎 數據庫計算封閉的一站式解決方案
        0閱讀 0條評論 個贊
        目錄前言引入一、數據庫封閉性帶來的問題?問題1:ETL變成ELT甚至LETETL:ELT:問題2:中間表帶來的資源消耗和耦合問題3:多樣性數據源問題4:存儲過程帶來的安全和耦合問題問題5:大……
      • Java可以重新鎖定的那些東西(1)
        0閱讀 0條評論 個贊
        本文主要包含的內容:可重入鎖(ReedtrantLock)、公平鎖、非公平鎖、可重入性、同步隊列、CAS等概念的理解顯式鎖……
      • 當老板讓我從Java8升級到Java11時
        4閱讀 0條評論 個贊
        老板讓我把一個項目從Java8遷移到Java11,我該怎么辦呢?最簡單的辦法,當然是直接強行升級,遇到一個錯就改一個錯,別看它low,但是對于一個小型且非核心的項目來說,已經足夠了。當然,……
      • 如何在C#程序中注入惡意DLL?
        6閱讀 0條評論 個贊
        一:背景前段時間在訓練營上課的時候就有朋友提到一個問題,為什么Windbg附加到C#程序后,程序就處于中斷狀態了?它到底是如何實現的?其實簡而言之就是線程的遠程注入,這一篇就展開說一下。二:……
      最近發布資訊
      更多
      警花高潮嗷嗷叫
      <del id="nnjnj"></del><track id="nnjnj"></track>

      <p id="nnjnj"></p>

      <address id="nnjnj"></address>

        <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

          <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>