内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

redis的過期時間和過期刪除機制原理

這篇文章主要介紹“redis的過期時間和過期刪除機制原理”,在日常操作中,相信很多人在redis的過期時間和過期刪除機制原理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”redis的過期時間和過期刪除機制原理”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)公司不只是一家網(wǎng)站建設的網(wǎng)絡公司;我們對營銷、技術(shù)、服務都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設質(zhì)量和服務品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務升級,滿足企業(yè)一站式全網(wǎng)營銷推廣需求,讓再小的成都品牌網(wǎng)站建設也能產(chǎn)生價值!

一:設置過期時間

redis有四種命令可以用于設置鍵的生存時間和過期時間:

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

二:保存過期時間

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

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

redis的過期時間和過期刪除機制原理

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

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

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

三:移除過期時間

PERSIST 命令可以移除一個鍵的過期時間:

127.0.0.1:6379> set message "hello"OK127.0.0.1:6379> expire message 60(integer) 1127.0.0.1:6379> ttl message(integer) 54127.0.0.1:6379> persist message(integer) 1127.0.0.1:6379> ttl message(integer) -1

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

redis> persist book(integer) 1

數(shù)據(jù)庫將更新成如下狀態(tài):

redis的過期時間和過期刪除機制原理

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

四:計算并返回剩余生存時間

ttl命令以秒為單位返回指定鍵的剩余生存時間。pttl以毫秒返回。兩個命令都是通過計算當前時間和過期時間的差值得到剩余生存期的。

127.0.0.1:6379> set minping shuxinOK127.0.0.1:6379> expire minping 60(integer) 1127.0.0.1:6379> ttl minping(integer) 57127.0.0.1:6379> ttl minping(integer) 27127.0.0.1:6379> pttl minping(integer) 23839127.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;    }        /* 如果鍵存在*/    /*如果沒有設置生存時間,返回 -1, 否則返回實際剩余時間 */    expire = getExpire(c->db,c->argv[1]);    if (expire != -1) {        /* 過期時間減去當前時間,就是鍵的剩余時間*/        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));    }}

五:過期鍵的刪除策略

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

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

立即刪除

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

而且目前redis事件處理器對時間事件的處理方式--無序鏈表,查找一個key的時間復雜度為O(n),所以并不適合用來處理大量的時間事件。

惰性刪除

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

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

定時刪除

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

六:redis使用的策略

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

到此,關(guān)于“redis的過期時間和過期刪除機制原理”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

本文標題:redis的過期時間和過期刪除機制原理
分享URL:http://www.rwnh.cn/article28/pgeocp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、營銷型網(wǎng)站建設、網(wǎng)站排名、網(wǎng)站導航網(wǎng)站設計公司、電子商務

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設
新龙县| 德阳市| 小金县| 永福县| 怀宁县| 定州市| 洛阳市| 广丰县| 砚山县| 银川市| 钟山县| 岳西县| 宿松县| 靖安县| 成都市| 盖州市| 阳春市| 定远县| 临泽县| 区。| 崇义县| 天祝| 三明市| 东安县| 永兴县| 汽车| 南漳县| 高青县| 蒲江县| 和静县| 黄山市| 建宁县| 大埔县| 垦利县| 岳阳县| 故城县| 勐海县| 乌鲁木齐县| 锡林浩特市| 吉安县| 绥德县|