亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談redis的過(guò)期時(shí)間設(shè)置和過(guò)期刪除機(jī)制

 更新時(shí)間:2022年03月18日 09:52:38   作者:夢(mèng)里尋鄉(xiāng)  
本文主要介紹了redis的過(guò)期時(shí)間設(shè)置和過(guò)期刪除機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一:設(shè)置過(guò)期時(shí)間

redis有四種命令可以用于設(shè)置鍵的生存時(shí)間和過(guò)期時(shí)間:

  • EXPIRE <KEY> <TTL> : 將鍵的生存時(shí)間設(shè)為 ttl 秒
  • PEXPIRE <KEY> <TTL> :將鍵的生存時(shí)間設(shè)為 ttl 毫秒
  • EXPIREAT <KEY> <timestamp> :將鍵的過(guò)期時(shí)間設(shè)為 timestamp 所指定的秒數(shù)時(shí)間戳
  • PEXPIREAT <KEY> <timestamp>: 將鍵的過(guò)期時(shí)間設(shè)為 timestamp 所指定的毫秒數(shù)時(shí)間戳.

二:保存過(guò)期時(shí)間

那么redis里面對(duì)這些key的過(guò)期時(shí)間和生存時(shí)間的信息是怎么保存的呢??
答:在數(shù)據(jù)庫(kù)結(jié)構(gòu)redisDb中的expires字典中保存了數(shù)據(jù)庫(kù)中所有鍵的過(guò)期時(shí)間,我們稱expire這個(gè)字典為過(guò)期字典。
(1)過(guò)期字典是一個(gè)指針,指向鍵空間的某個(gè)鍵對(duì)象。
(2)過(guò)期字典的值是一個(gè)longlong類型的整數(shù),這個(gè)整數(shù)保存了鍵所指向的數(shù)據(jù)庫(kù)鍵的過(guò)期時(shí)間–一個(gè)毫秒級(jí)的 UNIX 時(shí)間戳。

下圖是一個(gè)帶過(guò)期字典的數(shù)據(jù)庫(kù)例子:

過(guò)期字典是存儲(chǔ)在redisDb這個(gè)結(jié)構(gòu)里的:

typedef struct redisDb {
    ...
    
    dict *dict;     //數(shù)據(jù)庫(kù)鍵空間,保存著數(shù)據(jù)庫(kù)中所有鍵值對(duì)
    dict *expires      // 過(guò)期字典,保存著鍵的過(guò)期時(shí)間
    ...
} redisDb;

從以上結(jié)構(gòu)中可以看到expire字典(過(guò)期字典)和dict字典(數(shù)據(jù)庫(kù)鍵空間,保存著數(shù)據(jù)庫(kù)中所有鍵值對(duì))是并列的,由此可見(jiàn)expire字典的重要性。

三:移除過(guò)期時(shí)間

PERSIST 命令可以移除一個(gè)鍵的過(guò)期時(shí)間:

127.0.0.1:6379> set message "hello"
OK
127.0.0.1:6379> expire message 60
(integer) 1
127.0.0.1:6379> ttl message
(integer) 54
127.0.0.1:6379> persist message
(integer) 1
127.0.0.1:6379> ttl message
(integer) -1

persist命令就是expire命令的反命令,這個(gè)函數(shù)在過(guò)期字典中查找給定的鍵,并從過(guò)期字典中移除。
比如在數(shù)據(jù)庫(kù)當(dāng)前狀態(tài)(如上圖所示),當(dāng)給book這個(gè)key移除過(guò)期時(shí)間:

redis> persist book
(integer) 1

數(shù)據(jù)庫(kù)將更新成如下?tīng)顟B(tài):

可以從圖中看到,當(dāng)PERSIST book命令執(zhí)行之后,過(guò)期字典中的 book 鍵消失了。

四:計(jì)算并返回剩余生存時(shí)間

ttl命令以秒為單位返回指定鍵的剩余生存時(shí)間。pttl以毫秒返回。兩個(gè)命令都是通過(guò)計(jì)算當(dāng)前時(shí)間和過(guò)期時(shí)間的差值得到剩余生存期的。

127.0.0.1:6379> set minping shuxin
OK
127.0.0.1:6379> expire minping 60
(integer) 1
127.0.0.1:6379> ttl minping
(integer) 57
127.0.0.1:6379> ttl minping
(integer) 27
127.0.0.1:6379> pttl minping
(integer) 23839
127.0.0.1:6379>

redis源碼為:

void ttlCommand(redisClient *c) {
    ttlGenericCommand(c, 0);
}
void pttlCommand(redisClient *c) {
    ttlGenericCommand(c, 1);
}
void ttlGenericCommand(redisClient *c, int output_ms) {
    long long expire, ttl = -1;
    /* 如果鍵不存在,返回-2 */
    if (lookupKeyRead(c->db,c->argv[1]) == NULL) {
        addReplyLongLong(c,-2);
        return;
    }
    
    /* 如果鍵存在*/
    /*如果沒(méi)有設(shè)置生存時(shí)間,返回 -1, 否則返回實(shí)際剩余時(shí)間 */
    expire = getExpire(c->db,c->argv[1]);
    if (expire != -1) {
        /* 過(guò)期時(shí)間減去當(dāng)前時(shí)間,就是鍵的剩余時(shí)間*/
        ttl = expire-mstime();
        if (ttl < 0) ttl = 0;
    }
    if (ttl == -1) {
        addReplyLongLong(c,-1);
    } else {
         /*將毫秒轉(zhuǎn)化為秒*/
        addReplyLongLong(c,output_ms ? ttl : ((ttl+500)/1000));
    }
}

五:過(guò)期鍵的刪除策略

如果一個(gè)鍵是過(guò)期的,那它到了過(guò)期時(shí)間之后是不是馬上就從內(nèi)存中被被刪除呢??如果不是,那過(guò)期后到底什么時(shí)候被刪除呢??

其實(shí)有三種不同的刪除策略:
(1):立即刪除。在設(shè)置鍵的過(guò)期時(shí)間時(shí),創(chuàng)建一個(gè)回調(diào)事件,當(dāng)過(guò)期時(shí)間達(dá)到時(shí),由時(shí)間處理器自動(dòng)執(zhí)行鍵的刪除操作。
(2):惰性刪除。鍵過(guò)期了就過(guò)期了,不管。每次從dict字典中按key取值時(shí),先檢查此key是否已經(jīng)過(guò)期,如果過(guò)期了就刪除它,并返回nil,如果沒(méi)過(guò)期,就返回鍵值。
(3):定時(shí)刪除。每隔一段時(shí)間,對(duì)expires字典進(jìn)行檢查,刪除里面的過(guò)期鍵。
可以看到,第二種為被動(dòng)刪除,第一種和第三種為主動(dòng)刪除,且第一種實(shí)時(shí)性更高。下面對(duì)這三種刪除策略進(jìn)行具體分析。

立即刪除

立即刪除能保證內(nèi)存中數(shù)據(jù)的最大新鮮度,因?yàn)樗WC過(guò)期鍵值會(huì)在過(guò)期后馬上被刪除,其所占用的內(nèi)存也會(huì)隨之釋放。但是立即刪除對(duì)cpu是最不友好的。因?yàn)閯h除操作會(huì)占用cpu的時(shí)間,如果剛好碰上了cpu很忙的時(shí)候,比如正在做交集或排序等計(jì)算的時(shí)候,就會(huì)給cpu造成額外的壓力。

而且目前redis事件處理器對(duì)時(shí)間事件的處理方式--無(wú)序鏈表,查找一個(gè)key的時(shí)間復(fù)雜度為O(n),所以并不適合用來(lái)處理大量的時(shí)間事件。

惰性刪除

惰性刪除是指,某個(gè)鍵值過(guò)期后,此鍵值不會(huì)馬上被刪除,而是等到下次被使用的時(shí)候,才會(huì)被檢查到過(guò)期,此時(shí)才能得到刪除。所以惰性刪除的缺點(diǎn)很明顯:浪費(fèi)內(nèi)存。dict字典和expires字典都要保存這個(gè)鍵值的信息。

舉個(gè)例子,對(duì)于一些按時(shí)間點(diǎn)來(lái)更新的數(shù)據(jù),比如log日志,過(guò)期后在很長(zhǎng)的一段時(shí)間內(nèi)可能都得不到訪問(wèn),這樣在這段時(shí)間內(nèi)就要拜拜浪費(fèi)這么多內(nèi)存來(lái)存log。這對(duì)于性能非常依賴于內(nèi)存大小的redis來(lái)說(shuō),是比較致命的。

定時(shí)刪除

從上面分析來(lái)看,立即刪除會(huì)短時(shí)間內(nèi)占用大量cpu,惰性刪除會(huì)在一段時(shí)間內(nèi)浪費(fèi)內(nèi)存,所以定時(shí)刪除是一個(gè)折中的辦法。
定時(shí)刪除是:每隔一段時(shí)間執(zhí)行一次刪除操作,并通過(guò)限制刪除操作執(zhí)行的時(shí)長(zhǎng)和頻率,來(lái)減少刪除操作對(duì)cpu的影響。另一方面定時(shí)刪除也有效的減少了因惰性刪除帶來(lái)的內(nèi)存浪費(fèi)。

六:redis使用的策略

redis使用的過(guò)期鍵值刪除策略是:惰性刪除加上定期刪除,兩者配合使用。

到此這篇關(guān)于淺談redis的過(guò)期時(shí)間設(shè)置和過(guò)期刪除機(jī)制的文章就介紹到這了,更多相關(guān)redis的過(guò)期時(shí)間設(shè)置和過(guò)期刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實(shí)現(xiàn)集群搭建+集群讀寫(xiě)的示例

    Redis實(shí)現(xiàn)集群搭建+集群讀寫(xiě)的示例

    本文介紹了Redis集群的搭建和讀寫(xiě)操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Redis消息隊(duì)列的三種實(shí)現(xiàn)方式

    Redis消息隊(duì)列的三種實(shí)現(xiàn)方式

    本文主要介紹了Redis消息隊(duì)列的三種實(shí)現(xiàn)方式,主要包括List實(shí)現(xiàn)消息隊(duì)列,PubSub消息隊(duì)列,Stream消息隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • redis中5種數(shù)據(jù)基礎(chǔ)查詢命令

    redis中5種數(shù)據(jù)基礎(chǔ)查詢命令

    本文主要介紹了redis中5種數(shù)據(jù)基礎(chǔ)查詢命令,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 如何使用Redis實(shí)現(xiàn)電商系統(tǒng)的庫(kù)存扣減

    如何使用Redis實(shí)現(xiàn)電商系統(tǒng)的庫(kù)存扣減

    在日常開(kāi)發(fā)中有很多地方都有類似扣減庫(kù)存的操作,本文主要介紹了如何使用Redis實(shí)現(xiàn)電商系統(tǒng)的庫(kù)存扣減,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • Redis?BigKey的問(wèn)題解決

    Redis?BigKey的問(wèn)題解決

    本文主要介紹了Redis?BigKey的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • redis中數(shù)據(jù)類型命令整理

    redis中數(shù)據(jù)類型命令整理

    在本篇文章里小編給大家整理的是關(guān)于redis中5種數(shù)據(jù)類型基本命令介紹,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • RedisDesktopManager?連接redis的方法

    RedisDesktopManager?連接redis的方法

    這篇文章主要介紹了RedisDesktopManager?連接redis,需要的朋友可以參考下
    2023-08-08
  • 淺談一下Redis的緩存穿透、擊穿和雪崩

    淺談一下Redis的緩存穿透、擊穿和雪崩

    這篇文章主要介紹了淺談一下Redis緩存穿透、擊穿和雪崩,緩存穿透是指在使用緩存系統(tǒng)時(shí),頻繁查詢一個(gè)不存在于緩存中的數(shù)據(jù),導(dǎo)致這個(gè)查詢每次都要通過(guò)緩存層去查詢數(shù)據(jù)源,無(wú)法從緩存中獲得結(jié)果,需要的朋友可以參考下
    2023-08-08
  • Redis中管道操作pipeline的實(shí)現(xiàn)

    Redis中管道操作pipeline的實(shí)現(xiàn)

    RedisPipeline是一種優(yōu)化客戶端與服務(wù)器通信的技術(shù),通過(guò)批量發(fā)送和接收命令減少網(wǎng)絡(luò)往返次數(shù),提高命令執(zhí)行效率,本文就來(lái)介紹一下Redis中管道操作pipeline的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    這篇文章主要給大家介紹了關(guān)于Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評(píng)論