欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis淘汰策略的幾種實現(xiàn)

 更新時間:2024年05月22日 11:29:06   作者:云養(yǎng)貓v2  
redis內(nèi)存數(shù)據(jù)數(shù)據(jù)集大小升到一定大的時候,就會實行數(shù)據(jù)淘汰策略,本文主要介紹了redis淘汰策略的幾種實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

redis內(nèi)存數(shù)據(jù)數(shù)據(jù)集大小升到一定大的時候,就會實行數(shù)據(jù)淘汰策略(回收策略)。

1,volatile-lru:從已設置過期時間的哈希表(server.db[i].expires)中隨機挑選多個key,然后在選到的key中用lru算法淘汰最近最少使用的數(shù)據(jù)

2,allkey-lru:從所有key的哈希表(server.db[i].dict)中隨機挑選多個key,然后再選到的key中利用lru算法淘汰最近最少使用的數(shù)據(jù)

3,volatile-ttl:從已設置過期時間的哈希表(server.db[i].expires)中隨機挑選多個key,然后在選到的key中選擇過期時間最小的數(shù)據(jù)淘汰掉。

4,volatile-random:從已設置過期時間的哈希表(server.db[i].expires)中隨機挑選key淘汰掉。

5,allkey-random:從所有的key的哈希表(server.db[i].dict)中隨機挑數(shù)據(jù)淘汰

6,no-eviction(驅(qū)逐):內(nèi)存達到上限,不淘汰數(shù)據(jù)。

redis確認驅(qū)逐某個鍵值對后,會刪除這個數(shù)據(jù),并將這個數(shù)據(jù)變更消息發(fā)布到本地(AOF持久化)和從機(主從連接)。

 LRU數(shù)據(jù)淘汰機制是這樣的:在數(shù)據(jù)集中隨機挑選幾個鍵值對,去除其中最近最少使用的鍵值對淘汰。所以Redis并不是保證取得所有數(shù)據(jù)集中最少最少使用的鍵值對,而只是在隨機挑選的幾個鍵值對中。

TTL數(shù)據(jù)淘汰機制:從國企時間redisDB.expires表中隨機挑選幾個鍵值對,取出其中最快過期的鍵值對淘汰。所以Redis并不保證取得所有過期時間表中最快過期的鍵值對,而是隨機挑選的幾個鍵值對中。

無論是什么機制,都是從所有的鍵值對中挑選合適的淘汰。

在哪里開始淘汰數(shù)據(jù)

Redis服務器每執(zhí)行一次命令的時候,會檢測使用的內(nèi)存是否超額。如果超額,即進行數(shù)據(jù)淘汰。

int freeMemoryIfNeeded(void) {
    /**
     * noeviction 不淘汰數(shù)據(jù),什么都不做
     */
    if (server.maxmemory_policy == MAXMEMORY_NO_EVICTION)
        return C_ERR;
    while (mem_freed < mem_tofree) {
        int j, k, keys_freed = 0;
        for (j = 0; j < server.dbnum; j++) {
            /**
             * 選擇操作的哈希表,Redis另外維護著一個保存過期時間的key=>expire關(guān)聯(lián)的哈希表
             */
            if (server.maxmemory_policy == MAXMEMORY_ALLKEYS_LRU ||
                server.maxmemory_policy == MAXMEMORY_ALLKEYS_RANDOM)
            {
                dict = server.db[j].dict;
            } else {
                dict = server.db[j].expires;
            }
            /**
             * 分支一:全局哈希表隨機或者過期時間哈希表中,隨機淘汰一個key
             */
            if (server.maxmemory_policy == MAXMEMORY_ALLKEYS_RANDOM ||
                server.maxmemory_policy == MAXMEMORY_VOLATILE_RANDOM)
            {
                de = dictGetRandomKey(dict);
                bestkey = dictGetKey(de);
            }
            /**
             * 分支二:全局哈希表隨機或者過期時間哈希表中,隨機采樣多個數(shù)據(jù),再運用lru算法挑選一個淘汰
             */
            else if (server.maxmemory_policy == MAXMEMORY_ALLKEYS_LRU ||
                server.maxmemory_policy == MAXMEMORY_VOLATILE_LRU)
            {
                /* 樣本集 */
                struct evictionPoolEntry *pool = db->eviction_pool;
                while(bestkey == NULL) {
                    /* 
                     * 采樣,更新和維護樣本集;
                     * 樣本集開始是空的,每次操作完并不會清空樣本集;
                     * 而且每次采樣,都會采集多個數(shù)據(jù),同時和樣本集中已有的數(shù)據(jù)進行比較,新增或者更新樣本集;
                     */ 
                    evictionPoolPopulate(dict, db->dict, db->eviction_pool);
                    /**
                     * 開始對樣本集使用lru算法,淘汰樣本集中訪問時間最晚的key
                     */
                    for (k = MAXMEMORY_EVICTION_POOL_SIZE-1; k >= 0; k--) {
                        if (pool[k].key == NULL) continue;
                        de = dictFind(dict,pool[k].key);
                        /* 把選取到的key從樣本集中移除 */
                        sdsfree(pool[k].key);
                        memmove(pool+k,pool+k+1,
                            sizeof(pool[0])*(MAXMEMORY_EVICTION_POOL_SIZE-k-1));
                        pool[MAXMEMORY_EVICTION_POOL_SIZE-1].key = NULL;
                        pool[MAXMEMORY_EVICTION_POOL_SIZE-1].idle = 0;
                        /* pool樣本集內(nèi)的key,只是樣本,不一定和db內(nèi)保持一致,也不必,可能在db中已經(jīng)被刪除的,所以要作判斷 */
                        if (de) {
                            bestkey = dictGetKey(de);
                            break;
                        } else {
                            /* Ghost... */
                            continue;
                        }
                    }
                }
            }
            /**
             * 分支三:在設置了過期時間的哈希表里面隨機選擇多個key,在挑選到的key中選擇過期時間最小的一個淘汰掉
             */
            else if (server.maxmemory_policy == MAXMEMORY_VOLATILE_TTL) {
                for (k = 0; k < server.maxmemory_samples; k++) {
                    sds thiskey;
                    long thisval;
                    de = dictGetRandomKey(dict);
                    thiskey = dictGetKey(de);
                    thisval = (long) dictGetVal(de);
                    if (bestkey == NULL || thisval < bestval) {
                        bestkey = thiskey;
                        bestval = thisval;
                    }
                }
            }
            if (bestkey) {
                long long delta;
                robj *keyobj = createStringObject(bestkey,sdslen(bestkey));
                // 命令擴散,把刪除key的命令同步到所有從庫slave
                propagateExpire(db,keyobj);
                // 刪除key
                dbDelete(db,keyobj);
            }
        }
    }
    return C_OK;
}

到此這篇關(guān)于redis淘汰策略的幾種實現(xiàn)的文章就介紹到這了,更多相關(guān)redis淘汰策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis為什么快如何實現(xiàn)高可用及持久化

    Redis為什么快如何實現(xiàn)高可用及持久化

    這篇文章主要介紹了Redis為什么快如何實現(xiàn)高可用及持久化,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Redis IP地址的綁定的實現(xiàn)

    Redis IP地址的綁定的實現(xiàn)

    這篇文章主要介紹了Redis IP地址的綁定的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 詳解Redis中Lua腳本的應用和實踐

    詳解Redis中Lua腳本的應用和實踐

    這篇文章主要介紹了詳解Redis中Lua腳本的應用和實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • redis-trib.rb命令詳解

    redis-trib.rb命令詳解

    redis-trib.rb是官方提供的Redis Cluster的管理工具,無需額外下載,默認位于源碼包的src目錄下,但因該工具是用ruby開發(fā)的,所以需要準備相關(guān)的依賴環(huán)境,這篇文章主要介紹了redis-trib.rb命令詳解,需要的朋友可以參考下
    2023-10-10
  • Redisson分布式鎖之加解鎖詳解

    Redisson分布式鎖之加解鎖詳解

    這篇文章主要為大家介紹了Redisson分布式鎖加解鎖的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Redis 鍵值設計使用總結(jié)

    Redis 鍵值設計使用總結(jié)

    這篇文章主要介紹了Redis鍵值設計的使用總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • redis中事務機制及樂觀鎖的實現(xiàn)

    redis中事務機制及樂觀鎖的實現(xiàn)

    這篇文章主要介紹了redis中事務機制及樂觀鎖的相關(guān)內(nèi)容,通過事務的執(zhí)行分析Redis樂觀鎖,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • redis哈希和集合_動力節(jié)點Java學院整理

    redis哈希和集合_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了redis哈希和集合的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Redis底層類型之json命令使用

    Redis底層類型之json命令使用

    這篇文章主要為大家介紹了Redis底層類型之json命令使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • SpringBoot整合Redis實現(xiàn)序列化存儲Java對象的操作方法

    SpringBoot整合Redis實現(xiàn)序列化存儲Java對象的操作方法

    這篇文章主要介紹了SpringBoot整合Redis實現(xiàn)序列化存儲Java對象,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03

最新評論