<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
過期刪除策略: redis可以對key設定過期時間,因此要有相應的機制將已過期的鍵值對刪除。
expire key time
這是最常用的方式setex key, seconds, value
字串獨有的方式如果未設定時間,那就是永不過期。 如果設定了過期時間,使用 persist key
讓key永不過期。
每當我們對一個 key 設定了過期時間,Redis 會把該 key 帶上過期時間儲存到一個過期字典(expires dict)中,也就是說過期字典儲存了資料庫中所有 key 的過期時間。
過期字典儲存在 redisDb 結構中,如下:
typedef struct redisDb { dict *dict; /* 存放著所有的鍵值對 */ dict *expires; /* 過期字典: 鍵和鍵的過期時間 */ .... } redisDb; /* 過期字典資料結構結構如下: 過期字典的 key 是一個指標,指向某個鍵物件; 過期字典的 value 是一個 long long 型別的整數,這個整數儲存了 key 的過期時間; */
字典實際上是雜湊表,雜湊表的最大好處就是讓我們可以用 O(1) 的時間複雜度來快速查詢。
當我們查詢一個 key 時,Redis首先檢查該 key是否存在於過期字典中:
Redis 採用了 惰性刪除 + 定期刪除 的方式處理過期資料,以求在合理使用 CPU 時間和避免記憶體浪費之間取得平衡 。
Redis 為了保證定期刪除不會出現迴圈過度,導致執行緒卡死現象,為此增加了定期刪除迴圈流程的時間上限,預設不會超過 25ms(超過就停止檢查)。
記憶體淘汰策略:redis 的執行記憶體已經超過redis設定的最大記憶體後,會使用記憶體淘汰策略刪除符合條件的 key,以此來保障 Redis 高效的執行。
在組態檔 redis.conf 中,可以通過引數 maxmemory
來設定最大執行記憶體,只有在 Redis 的執行記憶體達到了我們設定的最大執行記憶體,才會觸發記憶體淘汰策略。
不同位數的作業系統,maxmemory 的預設值是不同的:
Redis 記憶體淘汰策略共有八種,這八種策略大體分為「不進行資料淘汰」和「進行資料淘汰」兩類策略
不進行資料淘汰的策略:
在設定了過期時間的資料中進行淘汰:
在所有資料範圍內進行淘汰:
可以使用 config get maxmemory-policy 命令,來檢視當前 Redis 的記憶體淘汰策略,命令如下:
127.0.0.1:6379> config get maxmemory-policy 1) "maxmemory-policy" 2) "noeviction"
Redis 使用的是 noeviction
型別的記憶體淘汰策略,它是 Redis 3.0 之後預設使用的記憶體淘汰策略,表示當執行記憶體超過最大設定記憶體時,不淘汰任何資料,但新增操作會報錯。
設定記憶體淘汰策略有兩種方法:
LRU全稱是 Least Recently Used 翻譯為 最近最少使用,會選擇淘汰最近最少使用的資料
Redis 並沒有使用這樣的方式實現 LRU 演演算法,因為傳統的 LRU 演演算法存在兩個問題:
Redis 實現的是一種近似 LRU 演演算法,目的是為了更好的節約記憶體,它的實現方式是在 Redis 的物件結構體中新增一個額外的欄位,用於記錄此資料的最後一次存取時間。
當 Redis 進行記憶體淘汰時,會使用隨機取樣的方式來淘汰資料,它是隨機取 5 個值(此值可設定),然後淘汰最久沒有使用的那個。
Redis 實現的 LRU 演演算法的優點:
但是 LRU 演演算法有一個問題,無法解決快取汙染問題,比如應用一次讀取了大量的資料,而這些資料只會被讀取這一次,那麼這些資料會留存在 Redis 快取中很長一段時間,造成快取汙染。因此,在 Redis 4.0 之後引入了 LFU 演演算法來解決這個問題
LFU 全稱是 Least Frequently Used 翻譯為最近最不常用的,LFU 演演算法是根據資料存取次數來淘汰資料的,它的核心思想是"如果資料過去被存取多次,那麼將來被存取的頻率也更高"。所以, LFU 演演算法會記錄每個資料的存取次數。當一個資料被再次存取時,就會增加該資料的存取次數。這樣就解決了偶爾被存取一次之後,資料留存在快取中很長一段時間的問題,相比於 LRU 演演算法也更合理一些.
LFU 演演算法相比於 LRU 演演算法的實現,多記錄了「資料的存取頻次」的資訊。
Redis 物件的結構如下:
typedef struct redisObject { ... unsigned lru:24; // 24 bits,用於記錄物件的存取資訊 ... } robj;
Redis 物件頭中的 lru 欄位,在 LRU 演演算法下和 LFU 演演算法下使用方式並不相同。
在 LRU 演演算法中,Redis 物件頭的 24 bits 的 lru 欄位是用來記錄 key 的存取時間戳,因此在 LRU 模式下,Redis可以根據物件頭中的 lru 欄位記錄的值,來比較最後一次 key 的存取時間長,從而淘汰最久未被使用的 key。
在 LFU 演演算法中,Redis物件頭的 24 bits 的 lru 欄位被分成兩段來儲存,高 16bit 儲存 ldt(Last Decrement Time),低 8bit 儲存 logc(Logistic Counter)。
注意:logc並不是單純的存取次數,而是存取頻次(存取頻率),因為logc會隨時間推移而衰減的。
在每次 key 被存取時,會先對 logc 做一個衰減操作,衰減的值跟前後存取時間的差距有關係,如果上一次存取的時間與這一次存取的時間差距很大,那麼衰減的值就越大,這樣實現的 LFU 演演算法是根據存取頻率來淘汰資料的,而不只是存取次數。存取頻率需要考慮 key 的存取是多長時間段內發生的。key 的先前存取距離當前時間越長,那麼這個 key 的存取頻率相應地也就會降低,這樣被淘汰的概率也會更大。
對 logc 做完衰減操作後,就開始對 logc 進行增加操作,增加操作並不是單純的 + 1,而是根據概率增加,如果 logc 越大的 key,它的 logc 就越難再增加。
所以,Redis 在存取 key 時,對於 logc 是這樣變化的: 先按照上次存取距離當前的時長,來對 logc 進行衰減; 然後,再按照一定概率增加 logc 的值
redis.conf 提供了兩個設定項,用於調整 LFU 演演算法從而控制 logc 的增長和衰減:
到此這篇關於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