最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis的過期策略以及內(nèi)存淘汰機制詳解

 更新時間:2025年04月23日 09:12:31   作者:echola_mendes  
這篇文章主要介紹了Redis的過期策略以及內(nèi)存淘汰機制,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

在談Redis過期概念時,先拋出幾個問題:

  • 1:Redis 給緩存數(shù)據(jù)設(shè)置過期時間?
  • 2:Redis 是如何判斷數(shù)據(jù)是否過期的呢?
  • 3:大量 key 集中過期怎么辦?

那么代入問題,根據(jù)概念思考這幾個問題吧

Redis有三種數(shù)據(jù)過期策略:定時刪除,惰性刪除,定期刪除

???一、過期策略

1、惰性刪除

當(dāng)讀/寫一個已經(jīng)過期的key時,會觸發(fā)惰性刪除策略,判斷key是否過期,如果過期了直接刪除掉這個key

簡而言之:就是當(dāng)被讀寫的時候,再判斷是否過期再刪除

對于過期的key不作任何處理,當(dāng)獲取key時檢查key是否過期,過期就刪除,否則直接返回。

  • 優(yōu)點:刪除key操作只在取出key時發(fā)生,只刪除當(dāng)前key,占用CPU少。
  • 缺點:當(dāng)大量key超出過期時間后未被使用,會占用大量內(nèi)存

2、定時刪除

由于惰性刪除策略無法保證冷數(shù)據(jù)被及時的刪掉,所以Redis會定期(默認每100ms)主動淘汰一批已過期的key,這里的一批只是部分過期的key,所以可能會出現(xiàn)部分key已經(jīng)過期但是還沒有被清理掉的情況,導(dǎo)致內(nèi)存沒有被及時釋放

簡而言之:每隔一定時間刪除

在設(shè)置key的過期時間時設(shè)置定時器,當(dāng)key過期時通過定時器刪除key。

  • 優(yōu)點:保證過期的key被及時刪除。
  • 缺點:在key過多時,刪除key會占用cpu資源,對服務(wù)器的響應(yīng)時間和吞吐量造成影響。同時為每個key設(shè)置定時器有性能消耗

3、定期刪除

redis默認每隔100ms就隨機抽取一些設(shè)置了過期時間的key,檢查其是否過期,如果有過期就刪除。注意這里是隨機抽取的。為什么要隨機呢?你想一想假如 redis 存了幾十萬個 key ,每隔100ms就遍歷所有的設(shè)置過期時間的 key 的話,就會給 CPU 帶來很大的負載

簡而言之:隨機每隔一定時間刪除

定時刪除和惰性刪除的這種方案,每隔一段時間檢查redis中過期的key,并通過限制刪除執(zhí)行的時長和頻率。

  • 優(yōu)點:刪除key時限制了刪除操作的時長和頻率,減少了對CPU的影響。即使刪除了過期key,減少了內(nèi)存的占用。
  • 缺點:如果定期刪除太頻繁,或者執(zhí)行時間太長,會退化為定時刪除,占用CPU資源。如果刪除執(zhí)行時間太短,或者執(zhí)行頻率低,會退化為惰性刪除,出現(xiàn)內(nèi)存浪費。

Redis使用的是定期刪除+惰性刪除的策略,在合理使用CPU和避免內(nèi)存浪費之間平衡

定期刪除+惰性刪除存在的問題

如果某個key過期后,定期刪除沒刪除成功,然后也沒再次去請求key,也就是說惰性刪除也沒生效。這時,如果大量過期的key堆積在內(nèi)存中,redis的內(nèi)存會越來越高,導(dǎo)致redis的內(nèi)存塊耗盡。那么就應(yīng)該采用內(nèi)存淘汰機制

二、內(nèi)存淘汰機制

???1、內(nèi)存淘汰策略

Redis Key沒設(shè)置過期時間為什么被Redis主動刪除了?

當(dāng)Redis已用內(nèi)存超過maxmemory限定時,就會觸發(fā)主動清理策略

在 redis.conf 中有一行配置:

# maxmemory-policy noeviction

Redis的默認淘汰策略是noeviction

執(zhí)行流程如下

主動清理策略在Redis4.0之前一共實現(xiàn)了8種內(nèi)存淘汰策略

a)針對設(shè)置了過期時間的key做處理:

  • 1、volatile-ttl:在設(shè)置了過期時間的鍵值對中,移除即將過期的鍵值對。
  • 2、volatile-random:在設(shè)置了過期時間的鍵值對中,隨機移除某個鍵值對。
  • 3、volatile-lru:在設(shè)置了過期時間的鍵值對中,移除最近最少使用的鍵值對。
  • 4、volatile-lfu:在設(shè)置了過期時間的鍵值對中,移除最近最不頻繁使用的鍵值對

b)針對所有的key做處理:

  • 5、allkeys-random:在所有鍵值對中,隨機移除某個key。
  • 6、allkeys-lru:在所有的鍵值對中,移除最近最少使用的鍵值對。
  • 7、allkeys-lfu:在所有的鍵值對中,移除最近最不頻繁使用的鍵值對

c)不處理:

  • 8、noeviction:不進行淘汰數(shù)據(jù)。不會刪除任何數(shù)據(jù),拒絕所有寫入操作并返回客戶端錯誤信息"(error) OOM command not allowed when used memory",此時Redis只響應(yīng)讀操作

一旦緩存被寫滿,再有寫請求進來,Redis就不再提供服務(wù),而是直接返回錯誤。Redis 用作緩存時,實際的數(shù)據(jù)集通常都是大于緩存容量的,總會有新的數(shù)據(jù)要寫入緩存,這個策略本身不淘汰數(shù)據(jù),也就不會騰出新的緩存空間,我們不把它用在 Redis 緩存中

???2、內(nèi)存淘汰算法

從內(nèi)測淘汰策略分類上,我們可以得知,除了隨機刪除和不刪除之外,主要有兩種淘汰算法:LRU 算法和 LFU 算法

  • LRU算法(Least Recently Used,最近最少使用):淘汰很久沒被訪問過的數(shù)據(jù),以最近一次訪問時間作為參考
  • LFU算法(Least Frequently Used,最不經(jīng)常使用):淘汰最近一段時間被訪問次數(shù)最少得數(shù)據(jù),以次數(shù)作為參考

絕大多數(shù)情況,使用LRU算法,當(dāng)存在大量熱點緩存數(shù)據(jù)時,LFU可能更好點

三、Lazy-Free機制

Lazy-Free 特性是 Redis 4.0 開始引入的,指的是讓 Redis 采用異步方式延遲釋放 key 使用的內(nèi)存,將該操作交給單獨的子線程處理,避免阻塞主線程

目的是減少刪除鍵時對主線程的影響,從而提高 Redis 的整體性能。

Lazy Free 主要有兩種應(yīng)用場景:

  • 主動刪除:使用 UNLINK 命令代替 DEL 命令來刪除鍵。UNLINK 命令會在后臺異步地釋放內(nèi)存
  • 被動刪除:在某些情況下,如過期鍵的刪除或達到最大內(nèi)存限制時的緩存淘汰,Redis 會嘗試異步地釋放內(nèi)存。

Lazy Free 與緩存淘汰的關(guān)系

雖然 Lazy Free 不是緩存淘汰機制的一部分,但在緩存淘汰過程中,Lazy Free 可以用來優(yōu)化緩存淘汰操作的執(zhí)行方式,減少對 Redis 性能的影響。具體來說:

1、減少主線程阻塞:

在緩存淘汰策略中,當(dāng) Redis 需要刪除鍵來釋放內(nèi)存時,使用 Lazy Free 可以減少主循環(huán)的阻塞時間。這是因為刪除操作是在后臺線程中完成的,而不是立即執(zhí)行

2、提高性能:

Lazy Free 可以幫助提高 Redis 的性能,特別是在高負載的情況下,因為它減少了刪除操作對主線程的影響。

3、與緩存淘汰策略的交互:

當(dāng) Redis 需要根據(jù)緩存淘汰策略刪除鍵時,如果啟用了 Lazy Free,那么這些刪除操作可能會被異步執(zhí)行,這有助于減少對客戶端請求的延遲影響

例子:假設(shè) Redis 的緩存淘汰策略配置為 allkeys-lru,并且啟用了 Lazy Free

當(dāng) Redis 達到最大內(nèi)存限制時,它會根據(jù) LRU 策略選擇一些鍵來刪除。

如果這些鍵滿足 Lazy Free 的條件(例如,使用了 UNLINK 命令或配置了相應(yīng)的 Lazy Free 選項),那么這些鍵的刪除操作將在后臺異步執(zhí)行,而不是立即在主線程中執(zhí)行

也就是說如果沒有Lazy Free,執(zhí)行緩存淘汰策略時,刪除鍵的操作將會同步執(zhí)行,可能會阻塞主線程,影響其他客戶端的請求

四、相關(guān)問題

好了,來解決上面拋出的問題

1:Redis 給緩存數(shù)據(jù)設(shè)置過期時間?

(1)Redis的內(nèi)存是有限的

  • 如果不對緩存數(shù)據(jù)設(shè)置過期時間,那內(nèi)存占用就會一直增長,最終可能會導(dǎo)致 OOM 問題。
  • 通過設(shè)置合理的過期時間,Redis 會自動刪除暫時不需要的數(shù)據(jù),為新的緩存數(shù)據(jù)騰出空間

(2)某些業(yè)務(wù)場景需要某些數(shù)據(jù)在一段時間后過期

  • 比如我們的短信驗證碼可能只在 1 分鐘內(nèi)有效,用戶登錄的 Token 可能只在 1 天內(nèi)有效
  • 如果使用傳統(tǒng)的數(shù)據(jù)庫來處理的話,一般都是自己判斷過期,這樣更麻煩并且性能要差很多

2:Redis 是如何判斷數(shù)據(jù)是否過期的呢?

  • Redis 通過一個叫做過期字典(可以看作是 hash 表)來保存數(shù)據(jù)過期的時間。過期字典的鍵指向 Redis 數(shù)據(jù)庫中的某個 key(鍵)
  • 過期字典的值是一個 long類型的整數(shù),這個整數(shù)保存了 key 所指向的數(shù)據(jù)庫鍵的過期時間(毫秒精度的 UNIX 時間戳)
  • 在查詢一個 key 的時候,Redis 首先檢查該 key 是否存在于過期字典中(時間復(fù)雜度為 O(1)),如果不在就直接返回,在的話需要判斷一下這個 key 是否過期,過期直接刪除 key 然后返回 null。

3:大量 key 集中過期怎么辦?

如果存在大量 key 集中過期的問題,可能會使 Redis 的請求延遲變高??梢圆捎孟旅娴目蛇x方案來應(yīng)對:

  • 盡量避免 key 集中過期,在設(shè)置鍵的過期時間時盡量隨機一點。
  • 對過期的 key 開啟 lazyfree 機制(修改 redis.conf 中的 lazyfree-lazy-expire參數(shù)即可),這樣會在后臺異步刪除過期的 key,不會阻塞主線程的運行。

總結(jié)

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

相關(guān)文章

  • 基于Redis實現(xiàn)共享Session登錄的實現(xiàn)

    基于Redis實現(xiàn)共享Session登錄的實現(xiàn)

    本文主要介紹了基于Redis實現(xiàn)共享Session登錄的實現(xiàn),包括發(fā)送短信驗證碼、短信驗證碼登錄和注冊、以及登錄狀態(tài)校驗的流程,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Redis五大基本數(shù)據(jù)類型及對應(yīng)使用場景總結(jié)

    Redis五大基本數(shù)據(jù)類型及對應(yīng)使用場景總結(jié)

    Redis有五種基本數(shù)據(jù)類型,分別是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted?Set),這些基本數(shù)據(jù)類型使得Redis具備了豐富的數(shù)據(jù)結(jié)構(gòu)和功能,適用于各種不同的應(yīng)用場景,本文就給大家詳細的介紹一下這五大類型
    2023-08-08
  • Redis腦裂問題處理基于min-replicas-to-write配置的解決方案

    Redis腦裂問題處理基于min-replicas-to-write配置的解決方案

    Redis腦裂是主從架構(gòu)中典型的一致性風(fēng)險問題,當(dāng)主節(jié)點與從節(jié)點網(wǎng)絡(luò)中斷但主節(jié)點仍正常運行時,可能導(dǎo)致數(shù)據(jù)錯亂、數(shù)據(jù)丟失等,本文就來介紹一下min-replicas-to-write配置的問題解決,感興趣的可以了解一下
    2026-04-04
  • python腳本實現(xiàn)Redis未授權(quán)批量提權(quán)

    python腳本實現(xiàn)Redis未授權(quán)批量提權(quán)

    這篇文章主要給大家介紹了關(guān)于利用python腳本實現(xiàn)redis未授權(quán)批量提權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Redis中哨兵機制和集群的區(qū)別及說明

    Redis中哨兵機制和集群的區(qū)別及說明

    Redis哨兵通過主從復(fù)制實現(xiàn)高可用,適用于中小規(guī)模數(shù)據(jù);集群采用分布式分片,支持動態(tài)擴展,適合大規(guī)模數(shù)據(jù),哨兵管理簡單但擴展性弱,集群性能更強但架構(gòu)復(fù)雜,根據(jù)數(shù)據(jù)量和擴展需求選擇
    2025-08-08
  • Redis MGET命令深度解析

    Redis MGET命令深度解析

    Redis的MGET命令是一種高效的批量讀取操作,可以顯著提高讀取性能,減少網(wǎng)絡(luò)往返的次數(shù),本文從MGET命令的機制實現(xiàn)、底層原理、應(yīng)用場景及性能優(yōu)化等多個維度,深入解析Redis中的MGET命令的工作方式,并對它與其他批量操作命令的對比進行了詳細介紹
    2024-09-09
  • Windows設(shè)置Redis為開機自啟動的流程步驟

    Windows設(shè)置Redis為開機自啟動的流程步驟

    Redis作為當(dāng)前最常用的當(dāng)前緩存技術(shù),基本上Web應(yīng)用中都有使用,所以,每次我們在本地啟動項目前,都必須將Redis服務(wù)端啟動,但是,每次都要去啟動Redis就很麻煩,本文主要就是介紹Windows系統(tǒng)如何配置開機啟動Redis,需要的朋友可以參考下
    2024-05-05
  • redis中刪除操作命令

    redis中刪除操作命令

    這篇文章主要介紹了redis中刪除操作命令,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • redis用list做消息隊列的實現(xiàn)示例

    redis用list做消息隊列的實現(xiàn)示例

    本文主要介紹了redis用list做消息隊列的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Redis實戰(zhàn)之商城購物車功能的實現(xiàn)代碼

    Redis實戰(zhàn)之商城購物車功能的實現(xiàn)代碼

    這篇文章主要介紹了Redis實戰(zhàn)之商城購物車功能的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02

最新評論

萝北县| 保靖县| 阳信县| 罗定市| 朝阳县| 洛川县| 大关县| 东山县| 双柏县| 建宁县| 乌什县| 福安市| 崇州市| 加查县| 高雄市| 泸溪县| 蓝田县| 郁南县| 湟源县| 宁安市| 阿克陶县| 诏安县| 通化县| 常山县| 高碑店市| 大城县| 孟津县| 枣强县| 隆安县| 涿鹿县| 西丰县| 梁平县| 桑植县| 乌鲁木齐县| 邹平县| 渭源县| 洪雅县| 香河县| 德化县| 化州市| 四平市|