欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis Key過期策略詳解

 更新時間:2025年06月08日 16:55:07   作者:呼拉拉呼拉  
這篇文章主要介紹了Redis Key過期策略的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

概述

Redis的Key過期策略是其內(nèi)存管理系統(tǒng)的核心組成部分,主要包括「被動過期」、「主動過期」和「內(nèi)存淘汰」三個機制。

本文將著重講解Redis的Key過期策略,從實現(xiàn)原理、工作流程到最佳實踐進(jìn)行全面解析。

Redis Key過期策略

Redis采用多策略組合的方式管理Key過期,主要包括三種機制:定時刪除、惰性刪除定期刪除

下面將分別對這三種key過期機制進(jìn)行實現(xiàn)原理、優(yōu)缺點、Redis采用的策略、以及RDB/AOF對不同過期策略的處理上的講解。

定時刪除

實現(xiàn)原理:  

  • 在設(shè)置key的過期時間的同時,為該key創(chuàng)建一個定時器,讓定時器在key過期時間來臨時,對key進(jìn)行刪除。

優(yōu)點: 

  • 內(nèi)存友好,可以及時清除過期的數(shù)據(jù)

缺點:  

  • cpu不友好,會占用大量cpu資源去處理過期的數(shù)據(jù),從而影響緩存的響應(yīng)時間和吞吐量。  
  • 定時器的創(chuàng)建耗時,若為每一個設(shè)置過期時間key創(chuàng)建一個定時器(將會產(chǎn)生大量的定時器),性能影響嚴(yán)重。  
  • Redis未采用此策略。

惰性刪除

實現(xiàn)原理:  

  • 只有當(dāng)訪問key時,才會判斷該key是否已經(jīng)是過期(觸發(fā)expireIfNeeded()檢查),過期則清除。  

優(yōu)點:  

  • cpu友好,零額外開銷  
  • 刪除操作精準(zhǔn) 

缺點:  

  • 內(nèi)存泄漏風(fēng)險:不訪問的過期Key永遠(yuǎn)存在。
  • 極端情況下可能會出現(xiàn)大量過期key沒有再被訪問,從而不會被刪除,占用大量無效內(nèi)存。

定期刪除

實現(xiàn)原理:  

每隔一定時間,掃描一定數(shù)量在數(shù)據(jù)庫中expires字典(過期字典)中一定數(shù)量的key,并清除其中已過期的key。

工作機制  

  • 周期性執(zhí)行activeExpireCycle()  
  • 隨機抽取部分過期字典中的Key檢查  
  • 采用自適應(yīng)算法控制CPU消耗

核心算法

def activeExpireCycle():
   while True:
    # 每次隨機檢查20個Key
    for i in range(20):
        key = random.choice(expires_dict)
        if key.expire_time < now:
            delete_key(key)
    # 動態(tài)退出條件
    if checked_keys < 20*25%:  # 過期率<25%則退出
        break

優(yōu)點:  

  • 該策略是前兩者的一個折中方案,通過調(diào)整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得cpu和內(nèi)存資源達(dá)到最優(yōu)的平衡效果。  
  • 通過限制刪除的時長和頻率,來減少刪除操作對cpu時間的占用 — 解決「定時刪除」的缺點  
  • 定期刪除過期key — 解決「惰性刪除」的缺點

缺點:  

  • 在內(nèi)存友好方面,不如「定時刪除」。  
  • 在cpu時間友好方面,不如「惰性刪除」。

難點:  

  • 合理設(shè)置操作的執(zhí)行時長(每次刪除執(zhí)行多長時間)和執(zhí)行頻率(每隔多久時間做一次刪除),這個需要各個業(yè)務(wù)場景根據(jù)實際情況進(jìn)行動態(tài)調(diào)整。

Redis采用的策略

Redis采用**「惰性刪除」** + **「定期刪除」**的混合策略

  • 混合策略架構(gòu)

「惰性刪除」 + 「定期刪除」策略

惰性刪除流程

  • 在進(jìn)行g(shù)et或setnx等操作時,先檢查key是否過期。  
  • 若過期,則刪除key,然后執(zhí)行相應(yīng)操作。  
  • 若沒過期,則直接執(zhí)行相應(yīng)操作。

定期刪除流程

1.遍歷每個數(shù)據(jù)庫(即redis.conf中配置的“database”數(shù)量,默認(rèn)為16)。  

2.檢查當(dāng)前庫中指定個數(shù)key(默認(rèn)是每個庫檢查20個key,相當(dāng)于循環(huán)執(zhí)行20次)。   

  • a. 如果當(dāng)前庫中沒有一個key設(shè)置了過期時間,直接執(zhí)行下一個庫的遍歷。   
  • b. 隨機獲取一個設(shè)置了過期時間的key,檢查key是否過期,如過期,刪除key。   
  • c. 判斷定期刪除操作是否已經(jīng)達(dá)到指定時長,若達(dá)到,則退出定期刪除。 

注意事項

  • 定期刪除,在程序中有一個全局變量current_db來記錄下一個將要便利的庫。
  • 假設(shè)有16個庫,這一次定期刪除遍歷了10個,那此時的current_db就是11,下一次定期刪除就從第 11庫開始遍歷。

持久化對過期策略的處理

RDB對過期策略的處理

說明:過期key對RDB沒有影響 

原理:  

1.從內(nèi)存持久化數(shù)據(jù)到RDB文件

主節(jié)點  

  • a. 生成RDB快照時會主動過濾已過期的Key。  
  • b. 僅持久化未過期的Key-value對。 

從節(jié)點  

  • a. 即使接收到的RDB文件包含未實際過期的Key。  
  • b. 加載時仍會執(zhí)行過期檢查(雙重保障)。

關(guān)鍵源碼

// rdb.c 源碼關(guān)鍵邏輯
int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, long long expiretime) {
    if (expiretime != -1 && expiretime < mstime()) {
        return 0; // 跳過已過期的Key
    }
    // 保存未過期的Key...
}

2.從RDB文件恢復(fù)數(shù)據(jù)到內(nèi)存 

全量加載流程:  

  • a. 清空當(dāng)前數(shù)據(jù)庫  
  • b. 解析RDB文件內(nèi)容  
  • c. 對每個Key執(zhí)行expireIfNeeded()檢查  
  • c. 僅加載未過期的Key

AOF對過期策略的處理

說明:過期key對AOF沒有影響 

原理: 

1.從內(nèi)存持久化數(shù)據(jù)到AOF文件

正常AOF追加模式  

  • a. AOF會將對應(yīng)Key的操作一并寫入文件中
操作類型AOF記錄內(nèi)容
Key設(shè)置過期PEXPIREAT key timestamp
Key自然過期DEL key(實際由propagateExpire()生成)
手動刪除直接記錄DEL key

AOF重寫時  

  • a. 重寫時,會先判斷Key是否過期,已過期的Key不會重寫到AOF文件

與RDB的區(qū)別  

  • a. 仍會記錄Key的過期時間(PEXPIREAT)  
  • b. 但實際數(shù)據(jù)只有未過期Key會被寫入

復(fù)制場景下的特殊處理

主從復(fù)制流程

節(jié)點角色過期Key處理方式
主節(jié)點惰性刪除+定期刪除
從節(jié)點僅依賴主節(jié)點的DEL同步

關(guān)鍵機制:  

  • a. 主節(jié)點過期后會向從節(jié)點傳播DEL命令  
  • b. 從節(jié)點不會主動刪除Key(即使已過期)  
  • c. 3.2+版本引入replica-ignore-expire配置(默認(rèn)關(guān)閉)

數(shù)據(jù)一致性風(fēng)險

場景:  

  • Key在主節(jié)點過期但尚未同步到從節(jié)點  
  • 此時主節(jié)點宕機,從節(jié)點晉升后:  
  • RDB加載:會重新檢查過期  
  • AOF回放:依賴記錄的DEL命令

總結(jié)對比表

持久化方式生成時處理加載時處理復(fù)制傳播
RDB過濾過期Key二次檢查全量同步
AOF記錄DEL命令按序重放增量同步
混合模式RDB部分過濾組合加載混合同步

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • redis-cli命令行工具的使用小結(jié)

    redis-cli命令行工具的使用小結(jié)

    redis-cli是Redis的命令行客戶端,支持多種參數(shù)用于連接、操作和管理Redis數(shù)據(jù)庫,本文給大家介紹redis-cli命令行工具的使用小結(jié),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • redis開啟和禁用登陸密碼校驗的方法

    redis開啟和禁用登陸密碼校驗的方法

    今天小編就為大家分享一篇redis開啟和禁用登陸密碼校驗的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Redis中的數(shù)據(jù)結(jié)構(gòu)跳表詳解

    Redis中的數(shù)據(jù)結(jié)構(gòu)跳表詳解

    跳表是一種基于并聯(lián)的鏈表結(jié)構(gòu),用于在有序元素序列中快速查找元素的數(shù)據(jù)結(jié)構(gòu),本文給大家介紹Redis中的數(shù)據(jù)結(jié)構(gòu)跳表,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Redis精確去重計數(shù)方法(咆哮位圖)

    Redis精確去重計數(shù)方法(咆哮位圖)

    這篇文章主要給大家介紹了關(guān)于Redis精確去重計數(shù)方法(咆哮位圖)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 關(guān)于在Redis中使用Pipelining加速查詢的問題

    關(guān)于在Redis中使用Pipelining加速查詢的問題

    這篇文章主要介紹了在Redis中使用Pipelining加速查詢,Redis是一個client-server模式的TCP服務(wù),也被稱為Request/Response協(xié)議的實現(xiàn),本文通過一個例子給大家詳細(xì)介紹,感興趣的朋友一起看看吧
    2022-05-05
  • Redis優(yōu)化token校驗主動失效的實現(xiàn)方案

    Redis優(yōu)化token校驗主動失效的實現(xiàn)方案

    在普通的token頒發(fā)和校驗中 當(dāng)用戶發(fā)現(xiàn)自己賬號和密碼被暴露了時修改了登錄密碼后舊的token仍然可以通過系統(tǒng)校驗直至token到達(dá)失效時間,所以系統(tǒng)需要token主動失效的一種能力,所以本文給大家介紹了Redis優(yōu)化token校驗主動失效的實現(xiàn)方案,需要的朋友可以參考下
    2024-03-03
  • Redis是單線程的嗎

    Redis是單線程的嗎

    Redis使用單線程的原因就是多線程并不能有效提升Redis的性能,相反可能還會降低性能,所以自然而然使用單線程,本文給大家詳細(xì)介紹了Redis為什么是單線程的,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • redis實現(xiàn)延時隊列的兩種方式(小結(jié))

    redis實現(xiàn)延時隊列的兩種方式(小結(jié))

    這篇文章主要介紹了redis實現(xiàn)延時隊列的兩種方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 淺析Redis中紅鎖RedLock的實現(xiàn)原理

    淺析Redis中紅鎖RedLock的實現(xiàn)原理

    RedLock?是一種分布式鎖的實現(xiàn)算法,由?Redis?的作者?Salvatore?Sanfilippo(也稱為?Antirez)提出,本文主要為大家詳細(xì)介紹了紅鎖RedLock的實現(xiàn)原理,感興趣的可以了解下
    2024-02-02
  • Redisson如何解決Redis分布式鎖提前釋放問題

    Redisson如何解決Redis分布式鎖提前釋放問題

    本文主要介紹了Redisson如何解決Redis分布式鎖提前釋放問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論