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

Redis過期刪除策略與內(nèi)存淘汰策略

 更新時間:2022年09月02日 17:03:04   作者:李顯赤赤  
這篇文章主要介紹了Redis過期刪除策略與內(nèi)存淘汰策略,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下

過期刪除策略

過期刪除策略: redis可以對key設(shè)置過期時間,因此要有相應(yīng)的機(jī)制將已過期的鍵值對刪除。

設(shè)置Redis中key的過期時間 (單位:秒)

  • 1)expire key time  這是最常用的方式
  • 2)setex key, seconds, value 字符串獨(dú)有的方式

如果未設(shè)置時間,那就是永不過期。 如果設(shè)置了過期時間,使用 persist key 讓key永不過期。

每當(dāng)我們對一個 key 設(shè)置了過期時間,Redis 會把該 key 帶上過期時間存儲到一個過期字典(expires dict)中,也就是說過期字典保存了數(shù)據(jù)庫中所有 key 的過期時間。

過期字典存儲在 redisDb 結(jié)構(gòu)中,如下:

typedef struct redisDb {
    dict *dict;    /* 存放著所有的鍵值對 */
    dict *expires; /* 過期字典: 鍵和鍵的過期時間 */
    ....
} redisDb;
/*
	過期字典數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)如下:
    過期字典的 key 是一個指針,指向某個鍵對象;
    過期字典的 value 是一個 long long 類型的整數(shù),這個整數(shù)保存了 key 的過期時間;
*/

字典實(shí)際上是哈希表,哈希表的最大好處就是讓我們可以用 O(1) 的時間復(fù)雜度來快速查找。

當(dāng)我們查詢一個 key 時,Redis首先檢查該 key是否存在于過期字典中:

  • 如果不在,則正常讀取鍵值(沒有設(shè)置過期時間)
  • 如果存在,則會獲取該 key 的過期時間,然后與當(dāng)前系統(tǒng)時間進(jìn)行比對,判定該 key是否過期

常見的三種過期刪除策略

  • 定時刪除:在設(shè)置key的過期時間時,同時創(chuàng)建一個定時事件,當(dāng)時間到達(dá)時,由事件處理器自動執(zhí)行key的刪除操作。
  • 惰性刪除:不主動刪除過期鍵,每次從數(shù)據(jù)庫訪問key時,都檢測key是否過期,如果過期則刪除該key。
  • 定期刪除:每隔一段時間「隨機(jī)」從數(shù)據(jù)庫中取出一定數(shù)量的key進(jìn)行檢查,并刪除其中的過期key。

Redis使用用的過期刪除策略

Redis 采用了 惰性刪除 + 定期刪除 的方式處理過期數(shù)據(jù),以求在合理使用 CPU 時間和避免內(nèi)存浪費(fèi)之間取得平衡 。

  • 惰性刪除的使用:當(dāng)我們訪問一個key時,會先檢查這個key是否過期,如果過期則刪除這個key并返回給客戶端null,否則返回對應(yīng)value
  • 定期刪除的使用:定期檢查一次數(shù)據(jù)庫,此配置可通過 Redis 的配置文件 redis.conf 進(jìn)行配置,配置鍵為 hz 它的默認(rèn)值是 hz 10( 從數(shù)據(jù)庫中隨機(jī)抽取20個key 進(jìn)行過期檢查 )

Redis的定期刪除的流程

  • 從過期字典中隨機(jī)抽取 20 個 key(20是寫死在代碼中的,不可修改)
  • 檢查這 20個key是否過期,并刪除過期的 key
  • 如果本輪檢查的已過期 key 的數(shù)量,超過 5 個(過期 key 的數(shù)量 / 20 > 25%),則再次抽取20個檢查檢查,如果某一次該比例小于 25%,則結(jié)束檢查,然后等待下一輪再檢查

Redis 為了保證定期刪除不會出現(xiàn)循環(huán)過度,導(dǎo)致線程卡死現(xiàn)象,為此增加了定期刪除循環(huán)流程的時間上限,默認(rèn)不會超過 25ms(超過就停止檢查)。

內(nèi)存淘汰策略

內(nèi)存淘汰策略:redis 的運(yùn)行內(nèi)存已經(jīng)超過redis設(shè)置的最大內(nèi)存后,會使用內(nèi)存淘汰策略刪除符合條件的 key,以此來保障 Redis 高效的運(yùn)行。

設(shè)置Redis最大運(yùn)行內(nèi)存

 在配置文件 redis.conf 中,可以通過參數(shù) maxmemory 來設(shè)定最大運(yùn)行內(nèi)存,只有在 Redis 的運(yùn)行內(nèi)存達(dá)到了我們設(shè)置的最大運(yùn)行內(nèi)存,才會觸發(fā)內(nèi)存淘汰策略。

不同位數(shù)的操作系統(tǒng),maxmemory 的默認(rèn)值是不同的:

  • 在 64 位操作系統(tǒng)中,maxmemory 的默認(rèn)值是 0,表示沒有內(nèi)存大小限制,那么不管用戶存放多少數(shù)據(jù)到 Redis 中,Redis 也不會對可用內(nèi)存進(jìn)行檢查,直到 Redis 實(shí)例因內(nèi)存不足而崩潰也無作為。
  • 在 32 位操作系統(tǒng)中,maxmemory 的默認(rèn)值是 3G,因?yàn)?32 位的機(jī)器最大只支持 4GB 的內(nèi)存,而系統(tǒng)本身就需要一定的內(nèi)存資源來支持運(yùn)行,所以 32 位操作系統(tǒng)限制最大 3 GB 的可用內(nèi)存是非常合理的,這樣可以避免因?yàn)閮?nèi)存不足而導(dǎo)致 Redis 實(shí)例崩潰

Redis 內(nèi)存淘汰策略有哪些?

Redis 內(nèi)存淘汰策略共有八種,這八種策略大體分為「不進(jìn)行數(shù)據(jù)淘汰」和「進(jìn)行數(shù)據(jù)淘汰」兩類策略

不進(jìn)行數(shù)據(jù)淘汰的策略:

  • noeviction(Redis3.0之后,默認(rèn)的內(nèi)存淘汰策略):它表示當(dāng)運(yùn)行內(nèi)存超過最大設(shè)置內(nèi)存時,不淘汰任何數(shù)據(jù),而是不再提供服務(wù),直接返回錯誤
  • 進(jìn)行數(shù)據(jù)淘汰的策略( 又可以細(xì)分為在設(shè)置了過期時間的數(shù)據(jù)中進(jìn)行淘汰在所有數(shù)據(jù)范圍內(nèi)進(jìn)行淘汰這兩類策略 )

在設(shè)置了過期時間的數(shù)據(jù)中進(jìn)行淘汰:

  • volatile-random:隨機(jī)淘汰設(shè)置了過期時間的任意鍵值
  • volatile-ttl:優(yōu)先淘汰更早過期的鍵值
  • volatile-lru(Redis3.0 之前,默認(rèn)的內(nèi)存淘汰策略):淘汰所有設(shè)置了過期時間的鍵值中,最久未使用的鍵值
  • volatile-lfu(Redis 4.0 后新增的內(nèi)存淘汰策略):淘汰所有設(shè)置了過期時間的鍵值中,最少使用的鍵值

在所有數(shù)據(jù)范圍內(nèi)進(jìn)行淘汰:

  • allkeys-random:隨機(jī)淘汰任意鍵值
  • allkeys-lru:淘汰整個鍵值中最久未使用的鍵值
  • allkeys-lfu(Redis 4.0 后新增的內(nèi)存淘汰策略):淘汰整個鍵值中最少使用的鍵值

可以使用 config get maxmemory-policy 命令,來查看當(dāng)前 Redis 的內(nèi)存淘汰策略,命令如下:

 127.0.0.1:6379> config get maxmemory-policy
 1) "maxmemory-policy"
 2) "noeviction"

Redis 使用的是 noeviction 類型的內(nèi)存淘汰策略,它是 Redis 3.0 之后默認(rèn)使用的內(nèi)存淘汰策略,表示當(dāng)運(yùn)行內(nèi)存超過最大設(shè)置內(nèi)存時,不淘汰任何數(shù)據(jù),但新增操作會報(bào)錯。

設(shè)置內(nèi)存淘汰策略有兩種方法:

  • 方式一:通過config set maxmemory-policy <策略>命令設(shè)置。立即生效,不需要重啟 Redis 服務(wù),但重啟 Redis 之后,設(shè)置就會失效
  • 方式二:通過修改 Redis 配置文件修改,設(shè)置maxmemory-policy <策略>,重啟 Redis 服務(wù)后配置不會丟失(修改了配置文件,必須重啟Redis服務(wù),設(shè)置才能生效)

LRU 算法和 LFU 算法有什么區(qū)別?

LRU全稱是 Least Recently Used 翻譯為 最近最少使用,會選擇淘汰最近最少使用的數(shù)據(jù)

Redis 并沒有使用這樣的方式實(shí)現(xiàn) LRU 算法因?yàn)閭鹘y(tǒng)的 LRU 算法存在兩個問題:

  • 需要用鏈表管理所有的緩存數(shù)據(jù),這會帶來額外的空間開銷;
  • 當(dāng)有數(shù)據(jù)被訪問時,需要在鏈表上把該數(shù)據(jù)移動到頭端,如果有大量數(shù)據(jù)被訪問,就會帶來很多鏈表移動操作,會很耗時,進(jìn)而會降低 Redis 緩存性能。

Redis 是如何實(shí)現(xiàn) LRU 算法的?

Redis 實(shí)現(xiàn)的是一種近似 LRU 算法,目的是為了更好的節(jié)約內(nèi)存,它的實(shí)現(xiàn)方式是在 Redis 的對象結(jié)構(gòu)體中添加一個額外的字段,用于記錄此數(shù)據(jù)的最后一次訪問時間。

當(dāng) Redis 進(jìn)行內(nèi)存淘汰時,會使用隨機(jī)采樣的方式來淘汰數(shù)據(jù),它是隨機(jī)取 5 個值(此值可配置),然后淘汰最久沒有使用的那個。

Redis 實(shí)現(xiàn)的 LRU 算法的優(yōu)點(diǎn):

  • 不用為所有的數(shù)據(jù)維護(hù)一個大鏈表,節(jié)省了空間占用
  • 不用在每次數(shù)據(jù)訪問時都移動鏈表項(xiàng),提升了緩存的性能

但是 LRU 算法有一個問題,無法解決緩存污染問題,比如應(yīng)用一次讀取了大量的數(shù)據(jù),而這些數(shù)據(jù)只會被讀取這一次,那么這些數(shù)據(jù)會留存在 Redis 緩存中很長一段時間,造成緩存污染。因此,在 Redis 4.0 之后引入了 LFU 算法來解決這個問題

什么是 LFU 算法?

LFU 全稱是 Least Frequently Used 翻譯為最近最不常用的,LFU 算法是根據(jù)數(shù)據(jù)訪問次數(shù)來淘汰數(shù)據(jù)的,它的核心思想是"如果數(shù)據(jù)過去被訪問多次,那么將來被訪問的頻率也更高"。所以, LFU 算法會記錄每個數(shù)據(jù)的訪問次數(shù)。當(dāng)一個數(shù)據(jù)被再次訪問時,就會增加該數(shù)據(jù)的訪問次數(shù)。這樣就解決了偶爾被訪問一次之后,數(shù)據(jù)留存在緩存中很長一段時間的問題,相比于 LRU 算法也更合理一些.

Redis 是如何實(shí)現(xiàn) LFU 算法的?

LFU 算法相比于 LRU 算法的實(shí)現(xiàn),多記錄了「數(shù)據(jù)的訪問頻次」的信息。

Redis 對象的結(jié)構(gòu)如下:

 typedef struct redisObject {
     ...
     unsigned lru:24;  // 24 bits,用于記錄對象的訪問信息
     ...
 } robj;

Redis 對象頭中的 lru 字段,在 LRU 算法下和 LFU 算法下使用方式并不相同。

 在 LRU 算法中,Redis 對象頭的 24 bits 的 lru 字段是用來記錄 key 的訪問時間戳,因此在 LRU 模式下,Redis可以根據(jù)對象頭中的 lru 字段記錄的值,來比較最后一次 key 的訪問時間長,從而淘汰最久未被使用的 key。

在 LFU 算法中,Redis對象頭的 24 bits 的 lru 字段被分成兩段來存儲,高 16bit 存儲 ldt(Last Decrement Time),低 8bit 存儲 logc(Logistic Counter)。

  • ldt 是用來記錄 key 的訪問時間戳
  • logc 是用來記錄 key 的訪問頻次,它的值越小表示使用頻率越低,越容易淘汰,每個新加入的 key 的logc 初始值為 5。

注意:logc并不是單純的訪問次數(shù),而是訪問頻次(訪問頻率),因?yàn)閘ogc會隨時間推移而衰減的。

在每次 key 被訪問時,會先對 logc 做一個衰減操作,衰減的值跟前后訪問時間的差距有關(guān)系,如果上一次訪問的時間與這一次訪問的時間差距很大,那么衰減的值就越大,這樣實(shí)現(xiàn)的 LFU 算法是根據(jù)訪問頻率來淘汰數(shù)據(jù)的,而不只是訪問次數(shù)。訪問頻率需要考慮 key 的訪問是多長時間段內(nèi)發(fā)生的。key 的先前訪問距離當(dāng)前時間越長,那么這個 key 的訪問頻率相應(yīng)地也就會降低,這樣被淘汰的概率也會更大。

對 logc 做完衰減操作后,就開始對 logc 進(jìn)行增加操作,增加操作并不是單純的 + 1,而是根據(jù)概率增加,如果 logc 越大的 key,它的 logc 就越難再增加。

所以,Redis 在訪問 key 時,對于 logc 是這樣變化的: 先按照上次訪問距離當(dāng)前的時長,來對 logc 進(jìn)行衰減;  然后,再按照一定概率增加 logc 的值

redis.conf 提供了兩個配置項(xiàng),用于調(diào)整 LFU 算法從而控制 logc 的增長和衰減:

  • lfu-decay-time:用于調(diào)整 logc 的衰減速度,它是一個以分鐘為單位的數(shù)值,默認(rèn)值為1,lfu-decay-time 值越大,衰減越慢;
  • lfu-log-factor:用于調(diào)整 logc 的增長速度,lfu-log-factor 值越大,logc 增長越慢。

到此這篇關(guān)于Redis過期刪除策略與內(nèi)存淘汰策略的文章就介紹到這了,更多相關(guān)Redis刪除策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 圖文詳解Windows下使用Redis緩存工具的方法

    圖文詳解Windows下使用Redis緩存工具的方法

    這篇文章以圖文結(jié)合的方式詳解Windows下使用Redis緩存工具的方法,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Redis cluster集群模式的原理解析

    Redis cluster集群模式的原理解析

    這篇文章主要介紹了Redis cluster集群模式的原理解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • redission分布式鎖防止重復(fù)初始化問題

    redission分布式鎖防止重復(fù)初始化問題

    這篇文章主要介紹了redission分布式鎖防止重復(fù)初始化問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 如何使用redis中的zset實(shí)現(xiàn)滑動窗口限流

    如何使用redis中的zset實(shí)現(xiàn)滑動窗口限流

    滑動窗口限流是一種常見的流量控制方法,它限制了在一定時間窗口內(nèi)的請求數(shù)量,下面是使用Redis ZSet實(shí)現(xiàn)滑動窗口限流的一個簡單示例,需要的朋友可以參考下
    2023-09-09
  • SpringBoot 開啟Redis緩存及使用方法

    SpringBoot 開啟Redis緩存及使用方法

    用redis做緩存,是因?yàn)閞edis有著很優(yōu)秀的讀寫能力,在集群下可以保證數(shù)據(jù)的高可用,那么今天通過本文給大家講解下SpringBoot使用Redis的緩存的方法,感興趣的朋友一起看看吧
    2021-08-08
  • Redis 存取 JSON 數(shù)據(jù)示例操作

    Redis 存取 JSON 數(shù)據(jù)示例操作

    JSON 是我們常用的數(shù)據(jù)類型,當(dāng)我們需要在Redis中保存json數(shù)據(jù)時是怎么存放的呢?一般是用String或者Hash,但還是不太方便,無法靈活的操作json 數(shù)據(jù),下面通過本文給大家介紹Redis存取JSON 數(shù)據(jù)示例操作,感興趣的的朋友一起看看吧
    2024-02-02
  • 基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列

    基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列

    這篇文章主要介紹了基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列,需要的朋友可以參考下
    2015-11-11
  • 基于Redis實(shí)現(xiàn)API接口訪問次數(shù)限制

    基于Redis實(shí)現(xiàn)API接口訪問次數(shù)限制

    日常開發(fā)中會有一個常見的需求,需要限制接口在單位時間內(nèi)的訪問次數(shù),比如說某個免費(fèi)的接口限制單個IP一分鐘內(nèi)只能訪問5次,該怎么實(shí)現(xiàn)呢,本文小編給大家介紹了如何基于Redis實(shí)現(xiàn)API接口訪問次數(shù)限制,需要的朋友可以參考下
    2024-11-11
  • Redis不僅僅是緩存,還是……

    Redis不僅僅是緩存,還是……

    Redis是一個開源的(BSD協(xié)議),內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲,它可以用作數(shù)據(jù)庫,緩存,消息代理。這篇文章主要介紹了Redis不僅僅是緩存,還是……,需要的朋友可以參考下
    2020-12-12
  • React?組件的常用生命周期函數(shù)匯總

    React?組件的常用生命周期函數(shù)匯總

    這篇文章主要介紹了React?組件的常用生命周期函數(shù)匯總,組件的生命周期有助于理解組件的運(yùn)行方式、完成更復(fù)雜的組件功能、分析組件錯誤原因等
    2022-08-08

最新評論

汽车| 大同市| 沂源县| 光泽县| 湟中县| 监利县| 伊通| 永城市| 班玛县| 瓦房店市| 静安区| 江川县| 繁峙县| 泗阳县| 宁津县| 屏山县| 榆中县| 临猗县| 庄河市| 北票市| 闽清县| 汤阴县| 东乡县| 高密市| 临颍县| 常宁市| 舒城县| 广昌县| 密山市| 依安县| 灌南县| 固镇县| 历史| 普定县| 龙州县| 万宁市| 潜江市| 邳州市| 库尔勒市| 思茅市| 金坛市|