<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
redis有四種命令可以用於設定鍵的生存時間和過期時間:
那麼redis裡面對這些key的過期時間和生存時間的資訊是怎麼儲存的呢??
答:在資料庫結構redisDb中的expires字典中儲存了資料庫中所有鍵的過期時間,我們稱expire這個字典為過期字典。
(1)過期字典是一個指標,指向鍵空間的某個鍵物件。
(2)過期字典的值是一個longlong型別的整數,這個整數儲存了鍵所指向的資料庫鍵的過期時間–一個毫秒級的 UNIX 時間戳。
下圖是一個帶過期字典的資料庫例子:
過期字典是儲存在redisDb這個結構裡的:
typedef struct redisDb { ... dict *dict; //資料庫鍵空間,儲存著資料庫中所有鍵值對 dict *expires // 過期字典,儲存著鍵的過期時間 ... } redisDb;
從以上結構中可以看到expire字典(過期字典)和dict字典(資料庫鍵空間,儲存著資料庫中所有鍵值對)是並列的,由此可見expire字典的重要性。
PERSIST 命令可以移除一個鍵的過期時間:
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命令的反命令,這個函數在過期字典中查詢給定的鍵,並從過期字典中移除。
比如在資料庫當前狀態(如上圖所示),當給book這個key移除過期時間:
redis> persist book (integer) 1
資料庫將更新成如下狀態:
可以從圖中看到,當PERSIST book命令執行之後,過期字典中的 book 鍵消失了。
ttl命令以秒為單位返回指定鍵的剩餘生存時間。pttl以毫秒返回。兩個命令都是通過計算當前時間和過期時間的差值得到剩餘生存期的。
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; } /* 如果鍵存在*/ /*如果沒有設定生存時間,返回 -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 { /*將毫秒轉化為秒*/ addReplyLongLong(c,output_ms ? ttl : ((ttl+500)/1000)); } }
如果一個鍵是過期的,那它到了過期時間之後是不是馬上就從記憶體中被被刪除呢??如果不是,那過期後到底什麼時候被刪除呢??
其實有三種不同的刪除策略:
(1):立即刪除。在設定鍵的過期時間時,建立一個回撥事件,當過期時間達到時,由時間處理器自動執行鍵的刪除操作。
(2):惰性刪除。鍵過期了就過期了,不管。每次從dict字典中按key取值時,先檢查此key是否已經過期,如果過期了就刪除它,並返回nil,如果沒過期,就返回鍵值。
(3):定時刪除。每隔一段時間,對expires字典進行檢查,刪除裡面的過期鍵。
可以看到,第二種為被動刪除,第一種和第三種為主動刪除,且第一種實時性更高。下面對這三種刪除策略進行具體分析。
立即刪除
立即刪除能保證記憶體中資料的最大新鮮度,因為它保證過期鍵值會在過期後馬上被刪除,其所佔用的記憶體也會隨之釋放。但是立即刪除對cpu是最不友好的。因為刪除操作會佔用cpu的時間,如果剛好碰上了cpu很忙的時候,比如正在做交集或排序等計算的時候,就會給cpu造成額外的壓力。
而且目前redis事件處理器對時間事件的處理方式--無序連結串列,查詢一個key的時間複雜度為O(n),所以並不適合用來處理大量的時間事件。
惰性刪除
惰性刪除是指,某個鍵值過期後,此鍵值不會馬上被刪除,而是等到下次被使用的時候,才會被檢查到過期,此時才能得到刪除。所以惰性刪除的缺點很明顯:浪費記憶體。dict字典和expires字典都要儲存這個鍵值的資訊。
舉個例子,對於一些按時間點來更新的資料,比如log紀錄檔,過期後在很長的一段時間內可能都得不到存取,這樣在這段時間內就要拜拜浪費這麼多記憶體來存log。這對於效能非常依賴於記憶體大小的redis來說,是比較致命的。
定時刪除
從上面分析來看,立即刪除會短時間內佔用大量cpu,惰性刪除會在一段時間內浪費記憶體,所以定時刪除是一個折中的辦法。
定時刪除是:每隔一段時間執行一次刪除操作,並通過限制刪除操作執行的時長和頻率,來減少刪除操作對cpu的影響。另一方面定時刪除也有效的減少了因惰性刪除帶來的記憶體浪費。
redis使用的過期鍵值刪除策略是:惰性刪除加上定期刪除,兩者配合使用。
到此這篇關於淺談redis的過期時間設定和過期刪除機制的文章就介紹到這了,更多相關redis的過期時間設定和過期刪除內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45