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

淺談Redis中LFU算法源碼解析

 更新時間:2025年04月10日 09:53:30   作者:百里自來卷  
Redis的LFU淘汰算法主要用于?maxmemory-policy?設(shè)置為allkeys-lfu或volatile-lfu時,以最少使用頻率的鍵進行淘汰,本文主要介紹了淺談Redis中LFU算法源碼解析,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Redis 的 LFU(Least Frequently Used,最不經(jīng)常使用)淘汰算法主要用于 maxmemory-policy 設(shè)置為 allkeys-lfu 或 volatile-lfu 時,以最少使用頻率的鍵進行淘汰。其核心實現(xiàn)涉及到 訪問頻率計數(shù) 和 時間衰減機制,源碼主要集中在 src/server.c 和 src/evict.c 文件中。

1. LFU 計數(shù)存儲

Redis 采用 8-bit 的 LRU 字段 來存儲訪問頻率計數(shù),存儲在 robj 結(jié)構(gòu)體的 lru 字段中:

struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; // 用于 LRU/LFU 計算
    int refcount;
    void *ptr;
};

其中 lru 變量的 8-bit 空間被拆分:

  • 前 6-bit(counter):用于存儲訪問計數(shù),最大值 63。
  • 后 2-bit(clock):用于時間衰減計算。

2. 訪問計數(shù)的計算

LFU 計數(shù)在每次訪問鍵時都會遞增,但遞增方式不是簡單 +1,而是使用 對數(shù)增長 方式,避免某些鍵因高訪問量而壟斷:

unsigned long LFUDecrAndReturn(robj *o) {
    unsigned long counter = LFUGetCounter(o);
    if (counter == 0) return 0;
    if (rand() % (counter + 1) == 0) counter--;
    LFUSetCounter(o, counter);
    return counter;
}

計數(shù)增長時:

int LFUIncrAndReturn(robj *o) {
    unsigned long counter = LFUGetCounter(o);
    if (counter < 63) {
        if (rand() % (counter + 1) == 0) counter++;
    }
    LFUSetCounter(o, counter);
    return counter;
}

這意味著:

  • 初始時計數(shù)增長較快 (1 → 2 → 3…)
  • 計數(shù)越高,增長概率越低(符合 對數(shù)曲線)
  • 這樣可以防止某些高訪問量鍵長期存活。

3. LFU 訪問頻率的衰減

由于有些數(shù)據(jù)可能短期內(nèi)訪問頻繁,但長期不再被訪問,因此 Redis 采用了 時間衰減機制:

每 1 分鐘 遞減一次訪問計數(shù)。

使用 2-bit 記錄最近訪問的時間 lfu_clock,每隔 60s 觸發(fā) 衰減:

#define LFU_INIT_VAL 5 // 初始訪問計數(shù)
unsigned long LFUDecrAndReturn(robj *o) {
    unsigned long counter = LFUGetCounter(o);
    if (counter == 0) return 0;
    if (rand() % (counter + 1) == 0) counter--;
    LFUSetCounter(o, counter);
    return counter;
}

該方法會按照一定概率減少計數(shù),確保 近期訪問過的鍵不會輕易被淘汰,而 長時間未訪問的鍵會逐步淘汰。

4. 淘汰策略

當(dāng) maxmemory 超出時,Redis 需要淘汰一部分數(shù)據(jù),LFU 主要執(zhí)行:

遍歷數(shù)據(jù),找到訪問計數(shù)最小的鍵。

采用 volatile-lfu 或 allkeys-lfu 進行數(shù)據(jù)刪除:

evictionPoolPopulate(dict *sample_dict) {
    // 從字典中隨機采樣 N 個鍵
    for (i = 0; i < EVPOOL_SIZE; i++) {
        lfu = LFUGetCounter(entry);
        if (lfu < min_lfu) {
            min_lfu = lfu;
            min_entry = entry;
        }
    }
    // 淘汰訪問次數(shù)最少的
    dictDelete(sample_dict, min_entry);
}

采用 近似隨機采樣,而不是遍歷所有鍵,提高效率。

5. 關(guān)鍵總結(jié)

  • 存儲方式:使用 robj.lru 變量的 8-bit 空間存儲訪問計數(shù)和時間信息。
  • 訪問計數(shù)增長:采用對數(shù)增長策略,防止單個鍵因訪問量過大而占用內(nèi)存。
  • 時間衰減:每分鐘對訪問頻率計數(shù)進行衰減,確保長期未訪問的鍵被淘汰。
  • 淘汰策略:采樣多個鍵,找到訪問計數(shù)最少的鍵進行刪除。

Redis 的 LFU 機制相比 LRU 更適用于熱點數(shù)據(jù)訪問場景,避免了某些短期流行的鍵占用大量緩存,同時也能讓真正的 高頻訪問數(shù)據(jù) 存活更久。

到此這篇關(guān)于淺談Redis中LFU算法源碼解析的文章就介紹到這了,更多相關(guān)Redis LFU算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis7.4.2單機配置過程

    redis7.4.2單機配置過程

    這段文章詳細介紹了通過源碼編譯安裝Redis的過程,涵蓋了從下載源碼包到卸載Redis的每一步驟,并強調(diào)了實踐中的實用性和重要性性,關(guān)鍵詞包括:源碼編譯、Redis安裝和卸載流程
    2026-05-05
  • Redis跳躍表添加元素的方法實現(xiàn)

    Redis跳躍表添加元素的方法實現(xiàn)

    本文主要介紹了Redis跳躍表添加元素的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis?搭建主從集群的操作指南

    Redis?搭建主從集群的操作指南

    單節(jié)點的?Redis?并發(fā)能力有限,要進一步提高?Redis?的并發(fā)能力,就需要搭建主從集群,實現(xiàn)讀寫分離,這篇文章主要給大家介紹了Redis搭建主從集群的操作指南,需要的朋友可以參考下
    2023-08-08
  • 為何Redis使用跳表而非紅黑樹實現(xiàn)SortedSet

    為何Redis使用跳表而非紅黑樹實現(xiàn)SortedSet

    本篇文章主要介紹了為何Redis使用跳表而非紅黑樹實現(xiàn)SortedSet,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 使用Redis實現(xiàn)點贊取消點贊的詳細代碼

    使用Redis實現(xiàn)點贊取消點贊的詳細代碼

    這篇文章主要介紹了Redis實現(xiàn)點贊取消點贊的詳細代碼,通過查詢某實體(帖子、評論等)點贊數(shù)量,需要用到事務(wù)相關(guān)知識,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Redis設(shè)置開機自啟動全過程

    Redis設(shè)置開機自啟動全過程

    這篇文章主要介紹了Redis設(shè)置開機自啟動全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-10-10
  • Redis Key大量集中失效的問題解決

    Redis Key大量集中失效的問題解決

    在 Redis 的實際應(yīng)用中,Key 的過期和失效是常見的場景,當(dāng)系統(tǒng)中存在大量 Key 集中過期時,可能會對服務(wù)器性能造成巨大沖擊,甚至引發(fā)服務(wù)中斷,本文就來介紹一下Redis Key大量集中失效的問題解決,感興趣的可以了解一下
    2025-09-09
  • 關(guān)于分布式鎖的三種實現(xiàn)方式

    關(guān)于分布式鎖的三種實現(xiàn)方式

    這篇文章主要介紹了關(guān)于分布式鎖的三種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Redis KEYS查詢大批量數(shù)據(jù)替代方案

    Redis KEYS查詢大批量數(shù)據(jù)替代方案

    在使用 Redis 時,KEYS 命令雖然簡單直接,但其全表掃描的特性在處理大規(guī)模數(shù)據(jù)時會導(dǎo)致性能問題,甚至可能阻塞 Redis 服務(wù),本文將介紹SCAN命令、有序集合、哈希表和RediSearch模塊四種替代 KEYS 的高效方案,需要的朋友可以參考下
    2024-12-12
  • 淺談Redis分布式鎖的正確實現(xiàn)方式

    淺談Redis分布式鎖的正確實現(xiàn)方式

    這篇文章主要介紹了淺談Redis分布式鎖的正確實現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論

西和县| 贺州市| 鹤岗市| 吴忠市| 五家渠市| 施秉县| 板桥市| 潞城市| 博爱县| 望都县| 冀州市| 原平市| 呈贡县| 宁德市| 巴南区| 阿鲁科尔沁旗| 法库县| 晋江市| 淳化县| 临泉县| 万盛区| 沙雅县| 龙泉市| 屯昌县| 游戏| 泽库县| 汾阳市| 尖扎县| 泰州市| 平利县| 辛集市| 东丽区| 昌乐县| 龙山县| 互助| 习水县| 通榆县| 深水埗区| 灌阳县| 望谟县| 平陆县|