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

Redis過期數(shù)據(jù)是否會(huì)被立馬刪除

 更新時(shí)間:2022年07月22日 11:06:02   作者:碼哥字節(jié)  
這篇文章主要為大家介紹了Redis過期數(shù)據(jù)會(huì)被立馬刪除么的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

當(dāng) key 達(dá)到過期時(shí)間,Redis 就會(huì)馬上刪除么?

先說結(jié)論:并不會(huì)立馬刪除。

Redis 有兩種刪除過期數(shù)據(jù)的策略:

  • 定期選取部分?jǐn)?shù)據(jù)刪除;
  • 惰性刪除;

該命令在 Redis 2.4 版本,過期時(shí)間并不是很精確,它可能在零到一秒之間。

從 Redis 2.6 開始,過期錯(cuò)誤為 0 到 1 毫秒。

EXPIRE key seconds [ NX | XX | GT | LT]

 指令可以將指定的 key 設(shè)置過期時(shí)間,如果沒有設(shè)置過期時(shí)間, key 將一直存在,除非我們明確將其刪除,比如執(zhí)行 DEL 指令。

所謂”狡兔死,走狗烹“,沒用了就干掉,跟 35 歲就“畢業(yè)”是一個(gè)道理。

好慌……

從 Redis 版本 7.0.0 開始:EXPIRE 添加了選項(xiàng):NX、XXGTLT 選項(xiàng)。

  • NX:當(dāng) key 沒有過期時(shí)才設(shè)置過期時(shí)間;
  • XX:只有 key 已過期的時(shí)候才設(shè)置過期時(shí)間;
  • GT:僅當(dāng)新的到期時(shí)間大于當(dāng)前到期時(shí)間時(shí)才設(shè)置過期時(shí)間;
  • LT:僅在新到期時(shí)間小于當(dāng)前到期時(shí)間才設(shè)置到過期時(shí)間。

過期與持久化

?主從或者集群架構(gòu)中,兩臺(tái)機(jī)器的時(shí)鐘嚴(yán)重不同步,會(huì)有什么問題么?

key 過期信息是用 Unix 絕對時(shí)間戳表示的。

為了讓過期操作正常運(yùn)行,機(jī)器之間的時(shí)間必須保證穩(wěn)定同步,否則就會(huì)出現(xiàn)過期時(shí)間不準(zhǔn)的情況。

比如兩臺(tái)時(shí)鐘嚴(yán)重不同步的機(jī)器發(fā)生 RDB 傳輸, slave 的時(shí)間設(shè)置為未來的 2000 秒,假如在 master 的一個(gè) key 設(shè)置 1000 秒存活,當(dāng) Slave 加載 RDB 的時(shí)候 key 就會(huì)認(rèn)為該 key 過期(因?yàn)?slave 機(jī)器時(shí)間設(shè)置為未來的 2000 s),并不會(huì)等待 1000 s 才過期。

機(jī)器時(shí)鐘不同步導(dǎo)致過期混亂

惰性刪除

惰性刪除很簡單,就是當(dāng)有客戶端的請求查詢該 key 的時(shí)候,檢查下 key 是否過期,如果過期,則刪除該 key

比如當(dāng) Redis 收到客戶端的GET movie:小澤#瑪……利亞.rmvb 請求,就會(huì)先檢查 key = movie:小澤#瑪……利亞.rmvb 是否已經(jīng)過期,如果過期那就刪除。

刪除過期數(shù)據(jù)的主動(dòng)權(quán)交給了每次訪問請求。

該實(shí)現(xiàn)通過 expireIfNeeded函數(shù)實(shí)現(xiàn),源碼路徑:src/db.c

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

定期刪除

僅僅靠客戶端訪問來判斷 key 是否過期才執(zhí)行刪除肯定不夠,因?yàn)橛械?key 過期了,但未來再也沒人訪問,這些數(shù)據(jù)要怎么刪除呢?

不能讓這些數(shù)據(jù)「占著茅坑不拉屎」。

所謂定期刪除,也就是 Redis 默認(rèn)每 1 秒運(yùn)行 10 次(每 100 ms 執(zhí)行一次),每次隨機(jī)抽取一些設(shè)置了過期時(shí)間的 key,檢查是否過期,如果發(fā)現(xiàn)過期了就直接刪除。

注意:并不是一次運(yùn)行就檢查所有的庫,所有的鍵,而是隨機(jī)檢查一定數(shù)量的鍵。

具體步驟如下:

定時(shí)刪除

  • 從所有設(shè)置了過期時(shí)間的 key 集合中隨機(jī)選擇 20 個(gè) key;
  • 刪除「步驟 1」發(fā)現(xiàn)的所有過期 key 數(shù)據(jù);
  • 「步驟 2 」結(jié)束,過期的 key 超過 25%,則繼續(xù)執(zhí)行「步驟 1」。

刪除的源碼 expire.c 的 activeExpireCycle 函數(shù)實(shí)現(xiàn)。

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

?為啥不檢查所有設(shè)置過期時(shí)間的 key?

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

注意了:不管是定時(shí)刪除,還是惰性刪除。當(dāng)數(shù)據(jù)刪除后,master 會(huì)生成刪除的指令記錄到 AOF 和 slave 節(jié)點(diǎn)。

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

會(huì)不會(huì)導(dǎo)致 Redis 內(nèi)存耗盡,怎么破?

這個(gè)問題問得好,答案是走內(nèi)存淘汰機(jī)制。

以上就是Redis過期數(shù)據(jù)是否會(huì)被立馬刪除的詳細(xì)內(nèi)容,更多關(guān)于Redis過期數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Redis未授權(quán)訪問漏洞利用的介紹與修復(fù)建議

    關(guān)于Redis未授權(quán)訪問漏洞利用的介紹與修復(fù)建議

    Redis是一個(gè)開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API,下面這篇文章主要給大家介紹了關(guān)于Redis未授權(quán)訪問漏洞利用的介紹和修復(fù)建議,文中介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-07-07
  • Linux快速部署Redis

    Linux快速部署Redis

    這篇文章介紹了Linux下快速部署Redis的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 詳解Redis用鏈表實(shí)現(xiàn)消息隊(duì)列

    詳解Redis用鏈表實(shí)現(xiàn)消息隊(duì)列

    Redis有兩種方式實(shí)現(xiàn)消息隊(duì)列,一種是用Redis自帶的鏈表數(shù)據(jù)結(jié)構(gòu),另一種是用Redis發(fā)布/訂閱模式實(shí)現(xiàn),這篇文章先介紹鏈表實(shí)現(xiàn)消息隊(duì)列,有需要的朋友們可以參考借鑒。
    2016-09-09
  • springboot中操作redis實(shí)例分享

    springboot中操作redis實(shí)例分享

    本文介紹了如何在Spring?Boot應(yīng)用中整合Redis緩存技術(shù),包括配置Redis連接、定義Redis模板、實(shí)現(xiàn)Redis的基本操作以及使用Spring?Cache注解。這些內(nèi)容可幫助開發(fā)者快速掌握Spring?Boot與Redis的集成,并提高應(yīng)用性能。
    2023-06-06
  • 淺析Redis?切片集群的數(shù)據(jù)傾斜問題

    淺析Redis?切片集群的數(shù)據(jù)傾斜問題

    如果?Redis?中的部署,采用的是切片集群,數(shù)據(jù)是會(huì)按照一定的規(guī)則分散到不同的實(shí)例中保存,比如,使用?Redis?Cluster?或?Codis,這篇文章主要介紹了Redis?切片集群的數(shù)據(jù)傾斜分析,需要的朋友可以參考下
    2022-06-06
  • Redis可視化客戶端小結(jié)

    Redis可視化客戶端小結(jié)

    因?yàn)?Redis 官方只提供了命令行版的 Redis 客戶端 redis-cli,以至于我們在使用的時(shí)候會(huì)比較麻煩,而且命令行版的客戶端看起來也不夠直觀,下面是我這些年使用過的一些 Redis 可視化客戶端,分享給大家
    2021-06-06
  • redis-cli 使用密碼登錄的實(shí)例

    redis-cli 使用密碼登錄的實(shí)例

    今天小編就為大家分享一篇redis-cli 使用密碼登錄的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Redis中散列類型的常用命令小結(jié)

    Redis中散列類型的常用命令小結(jié)

    散列類型的鍵值其實(shí)也是一種字典解耦,其存儲(chǔ)了字段和字段值的映射,但字段值只能是字符串,不支持其他數(shù)據(jù)類型,所以說散列類型不能嵌套其他的數(shù)據(jù)類型。下面就來詳細(xì)介紹下Redis中散列類型的常用命令,有需要的可以參考學(xué)習(xí)。
    2016-09-09
  • 解決redis服務(wù)啟動(dòng)失敗的問題

    解決redis服務(wù)啟動(dòng)失敗的問題

    今天小編就為大家分享一篇解決redis服務(wù)啟動(dòng)失敗的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Redis 密碼設(shè)置和查看密碼的方法

    Redis 密碼設(shè)置和查看密碼的方法

    這篇文章主要介紹了Redis 密碼設(shè)置和查看密碼的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-04-04

最新評論

剑川县| 岐山县| 银川市| 宝丰县| 屯昌县| 昔阳县| 商水县| 棋牌| 东乡| 三门县| 屏东县| 平潭县| 桃江县| 扎囊县| 太仆寺旗| 永丰县| 永寿县| 长子县| 长汀县| 柘城县| 泽普县| 武乡县| 武强县| 广元市| 三亚市| 和平县| 阿坝县| 汉寿县| 民和| 蓬安县| 临武县| 武平县| 女性| 盘山县| 镇雄县| 阳江市| 新源县| 老河口市| 通化县| 宜都市| 阿拉尔市|