搜尋
首頁資料庫Redis一文聊聊Redis中的過期策略

一文聊聊Redis中的過期策略

Jan 07, 2022 pm 07:05 PM
redis過期策略

這篇文章帶大家介紹一下Redis中的過期策略,看看惰性刪除策略、定期刪除策略的實作方法,希望對大家有幫助!

一文聊聊Redis中的過期策略

儲存過期時間

#Redis可以設定每個key過期時間,會將每個設定了過期時間的key放入一個獨立的字典。 【相關推薦:Redis影片教學

typedef struct redisDb { 
int id; //id是数据库序号,为0-15(默认Redis有16个数据库) 
long avg_ttl; //存储的数据库对象的平均ttl(time to live),用于统计 
dict *dict; //存储数据库所有的key-value 
dict *expires; //存储key的过期时间 
dict *blocking_keys;//blpop 存储阻塞key和客户端对象 
dict *ready_keys;//阻塞后push 响应阻塞客户端 存储阻塞后push的key和客户端对象 dict *watched_keys;//存储watch监控的的key和客户端对象 
} redisDb;

dict 用來維護一個Redis 資料庫中包含的所有Key-Value 鍵值對,expires則用來維護一個Redis 資料庫中設定了失效時間的鍵(即key與失效時間的映射)。 注意這裡的失效時間是用毫秒的時間戳表示的,例如2022-01-02 22:45:02過期則value為1641134702000

當我們使用expire指令設定一個key的失效時間時,Redis 首先到dict 這個字典表中尋找要設定的key是否存在,如果存在就將這個key和失效時間加到expires 這個字典表。

當我們使用setex指令向系統插入資料時,Redis 首先將 Key 和 Value 加入 dict 這個字典表中,然後將 Key 和失效時間加入 expires 這個字典表中。 注意setex只能用於字串

簡單地總結來說就是,設定了失效時間的key和具體的失效時間全部都維護在 expires 這個字典表中。

設定過期時間

expire的使用

expire指令的使用方法如下: expire key ttl(單位秒)

127.0.0.1:6379> expire name 2 #2秒失效 
(integer) 1 
127.0.0.1:6379> get name 
(nil) 
127.0.0.1:6379> set name zhangfei 
OK 
127.0.0.1:6379> ttl name #永久有效 
(integer) -1 
127.0.0.1:6379> expire name 30 #30秒失效 
(integer) 1 
127.0.0.1:6379> ttl name #还有24秒失效 
(integer) 24 
127.0.0.1:6379> ttl name #失效 
(integer) -2

Redis有四個不同的指令可以用來設定鍵的生存時間(鍵可以生存多久)或過期時間(鍵什麼時候會被刪除):

expire 指令用於將鍵key的生存時間設定為ttl

pexpire 指令用於將鍵key的生存時間設定為ttl毫秒

expireat 指令用於將鍵key的過期時間設定為timestamp所指定的數時間戳

#pexpireat 指令用於將鍵key的過期時間設定為timestamp所指定的毫秒數時間戳

注意expire、pexpire、expireat最終實作都是透過pexpireat實現的,也就是說無論客戶端執行哪個指令,都會將Redis轉換成pexpireat指令執行。所以expires字典中存的時間是用毫秒時間戳表示的鍵的過期時間。

過期策略

如果一個鍵過期了,那什麼時候被刪除呢?

有三種過期策略

  • 定時刪除:在設定鍵的過期時間的同時,建立一個定時器,讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。 (建立定時器刪除
  • 惰性刪除:放任鍵的過期不管,但是每次從鍵空間中取得鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。 (使用的時候刪除
  • 定期刪除:每隔一段時間,程式就會對資料庫進行一次檢查,刪除裡面過期的鍵。至於要刪除多少過期鍵,以及要檢查多少個資料庫,則有演算法決定。 (定期掃描刪除

#定時刪除

  • 優點

1、對記憶體最友善:透過使用定時器,可以保證過期的鍵會盡可能快地被刪除,釋放所佔記憶體

  • 缺點
##1、對cpu最不友善:在過期鍵比較多的情況下,刪除過期鍵此行為可能會佔用相當一部分cpu的時間,對伺服器的回應時間和吞吐量造成影響。

惰性刪除

    優點
1、對cpu最友善:只有在取出鍵的時候才會對過期鍵進行檢查,即不需要cpu定期掃描,也不需要建立大量的定時器。

    缺點
1、對記憶體最不友善:如果一個鍵已經過期,但是後面不會被存取的話,那麼就一直保留在資料庫中。如果這樣的鍵過多,無疑會佔用很大的記憶體。

定期刪除

定期刪除是上面的定時刪除和惰性刪除的一中折中方案。

    優點
1、定期刪除每隔一段時間執行一次過期鍵操作,並透過限制刪除操作執行的長度和頻率來減少刪除操作對cpu時間的影響。

2、透過刪除過期鍵,能有效的減少因為過期鍵而帶來的記憶體浪費

    缺點難以確定刪除操作執行的時長和頻率
1、如果刪除操作執行得太頻繁,或是執行的時間太長,定期刪除策略就會退化成定時刪除,以至於佔用太多cpu的執行時間。

2、如果刪除操作執行的時間太少,或執行時間太短,定期刪除策略又會和惰性刪除一樣,出現記憶體浪費。

Redis的過期策略

Redis使用是惰性刪除定期刪除兩種策略:透過配好使用這兩種策略,伺服器可以很好地在合理使用cpu時間和避免浪費記憶體空間之間取得平衡。

惰性刪除策略的實現

過期鍵的惰性刪除刪除策略由db.c/expireIfNeeded函數實現,所有讀寫資料庫的Redis命令在執行之前都會呼叫expireIfNeed函數對輸入鍵進行檢查:

  • 如果鍵已經過期,那麼expireIfNeeded函數將鍵刪除
  • 如果鍵未過期,那麼expireIfNeeded函數不做操作

指令呼叫expireIfNeeded函數程序如下圖

一文聊聊Redis中的過期策略

#另外因為每個被存取的鍵都可能被刪除,所以每個指令都必須能同時處理鍵存在以及不存在的情況。 下圖表示get指令的執行過程

一文聊聊Redis中的過期策略

有定期刪除策略的實作

##過期鍵的定期刪除策略由redis.c/activeExpireCycle函數實現,每當Redis的伺服器週期性操作redis.c/serverCron函數執行時,activeExpireCycle函數就會被調用,它在規定時間內,分多次遍歷伺服器中各個資料庫。

Redis 預設每秒進行 10 次過期掃描,過期掃描不會遍歷過期字典中所有的 key, 而是採用了一種簡單的貪心策略,步驟如下。

(1)從過期字典中隨機選出 20個 key。

(2)刪除這 20 個 key 中已經過期的 key。

(3)如果過期的 key的比例超過 1/4,那就重複步驟 (1)。同時,為了確保過期掃描不會出現循環過度,導致結程卡死的現象,演算法也增加了掃描時間的上限,預設不會超過 25ms。

假設一個大型的Redis 實例中所有的key 在同一時間過期了,會出現怎樣的結果呢?

消耗cpu

Redis會持續掃描過期字典(循環多次),直到過期字典中過期的key變得稀疏,才會停止(循環次數明顯下降)。

導致請求卡頓或逾時

當客戶端請求到來時,伺服器如果剛好進入過期掃描狀態,客戶端的請求將會等待至少25ms 後才會進行處理,如果客戶端將超時時間設定得比較短,例如​​10ms,那麼就會出現大量的連線因為超時而關閉,業務端就會出現很多異常

##所以一定要注意過期時間,如果有大批量的key過期,要給過期時間設定一個隨機範圍,而不能全部在同一時間過期。

更多程式相關知識,請造訪:

程式設計入門

! !

以上是一文聊聊Redis中的過期策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
REDIS:它如何充當數據存儲和服務REDIS:它如何充當數據存儲和服務Apr 24, 2025 am 12:08 AM

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

REDIS與其他數據庫:比較分析REDIS與其他數據庫:比較分析Apr 23, 2025 am 12:16 AM

Redis與其他數據庫相比,具有以下獨特優勢:1)速度極快,讀寫操作通常在微秒級別;2)支持豐富的數據結構和操作;3)靈活的使用場景,如緩存、計數器和發布訂閱。選擇Redis還是其他數據庫需根據具體需求和場景,Redis在高性能、低延遲應用中表現出色。

REDIS的角色:探索數據存儲和管理功能REDIS的角色:探索數據存儲和管理功能Apr 22, 2025 am 12:10 AM

Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

REDIS:了解NOSQL概念REDIS:了解NOSQL概念Apr 21, 2025 am 12:04 AM

Redis是一種NoSQL數據庫,適用於大規模數據的高效存儲和訪問。 1.Redis是開源的內存數據結構存儲系統,支持多種數據結構。 2.它提供極快的讀寫速度,適合緩存、會話管理等。 3.Redis支持持久化,通過RDB和AOF方式確保數據安全。 4.使用示例包括基本的鍵值對操作和高級的集合去重功能。 5.常見錯誤包括連接問題、數據類型不匹配和內存溢出,需注意調試。 6.性能優化建議包括選擇合適的數據結構和設置內存淘汰策略。

REDIS:現實世界的用例和示例REDIS:現實世界的用例和示例Apr 20, 2025 am 12:06 AM

Redis在現實世界中的應用包括:1.作為緩存系統加速數據庫查詢,2.存儲Web應用的會話數據,3.實現實時排行榜,4.作為消息隊列簡化消息傳遞。 Redis的多功能性和高性能使其在這些場景中大放異彩。

REDIS:探索其功能和功能REDIS:探索其功能和功能Apr 19, 2025 am 12:04 AM

Redis脫穎而出是因為其高速、多功能性和豐富的數據結構。 1)Redis支持字符串、列表、集合、散列和有序集合等數據結構。 2)它通過內存存儲數據,支持RDB和AOF持久化。 3)從Redis6.0開始引入多線程處理I/O操作,提升了高並發場景下的性能。

Redis是SQL還是NOSQL數據庫?答案解釋了Redis是SQL還是NOSQL數據庫?答案解釋了Apr 18, 2025 am 12:11 AM

RedisisclassifiedasaNoSQLdatabasebecauseitusesakey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.Itoffersspeedandflexibility,makingitidealforreal-timeapplicationsandcaching,butitmaynotbesuitableforscenariosrequiringstrictdataintegrityo

REDIS:提高應用程序性能和可擴展性REDIS:提高應用程序性能和可擴展性Apr 17, 2025 am 12:16 AM

Redis通過緩存數據、實現分佈式鎖和數據持久化來提升應用性能和可擴展性。 1)緩存數據:使用Redis緩存頻繁訪問的數據,提高數據訪問速度。 2)分佈式鎖:利用Redis實現分佈式鎖,確保在分佈式環境中操作的安全性。 3)數據持久化:通過RDB和AOF機制保證數據安全性,防止數據丟失。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中