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

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

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

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

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

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

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

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

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

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

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

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

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

無(wú)論是什么機(jī)制,都是從所有的鍵值對(duì)中挑選合適的淘汰。

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

Redis服務(wù)器每執(zhí)行一次命令的時(shí)候,會(huì)檢測(cè)使用的內(nèi)存是否超額。如果超額,即進(jìn)行數(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另外維護(hù)著一個(gè)保存過期時(shí)間的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;
            }
            /**
             * 分支一:全局哈希表隨機(jī)或者過期時(shí)間哈希表中,隨機(jī)淘汰一個(gè)key
             */
            if (server.maxmemory_policy == MAXMEMORY_ALLKEYS_RANDOM ||
                server.maxmemory_policy == MAXMEMORY_VOLATILE_RANDOM)
            {
                de = dictGetRandomKey(dict);
                bestkey = dictGetKey(de);
            }
            /**
             * 分支二:全局哈希表隨機(jī)或者過期時(shí)間哈希表中,隨機(jī)采樣多個(gè)數(shù)據(jù),再運(yùn)用lru算法挑選一個(gè)淘汰
             */
            else if (server.maxmemory_policy == MAXMEMORY_ALLKEYS_LRU ||
                server.maxmemory_policy == MAXMEMORY_VOLATILE_LRU)
            {
                /* 樣本集 */
                struct evictionPoolEntry *pool = db->eviction_pool;
                while(bestkey == NULL) {
                    /* 
                     * 采樣,更新和維護(hù)樣本集;
                     * 樣本集開始是空的,每次操作完并不會(huì)清空樣本集;
                     * 而且每次采樣,都會(huì)采集多個(gè)數(shù)據(jù),同時(shí)和樣本集中已有的數(shù)據(jù)進(jìn)行比較,新增或者更新樣本集;
                     */ 
                    evictionPoolPopulate(dict, db->dict, db->eviction_pool);
                    /**
                     * 開始對(duì)樣本集使用lru算法,淘汰樣本集中訪問時(shí)間最晚的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;
                        }
                    }
                }
            }
            /**
             * 分支三:在設(shè)置了過期時(shí)間的哈希表里面隨機(jī)選擇多個(gè)key,在挑選到的key中選擇過期時(shí)間最小的一個(gè)淘汰掉
             */
            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));
                // 命令擴(kuò)散,把刪除key的命令同步到所有從庫(kù)slave
                propagateExpire(db,keyobj);
                // 刪除key
                dbDelete(db,keyobj);
            }
        }
    }
    return C_OK;
}

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

相關(guān)文章

  • Redis中的慢日志

    Redis中的慢日志

    這篇文章主要介紹了Redis中的慢日志,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Redis網(wǎng)絡(luò)I/O模型的使用及說明

    Redis網(wǎng)絡(luò)I/O模型的使用及說明

    文章詳細(xì)介紹了Redis的網(wǎng)絡(luò)模型,包括單線程和多線程模型,以及I/O多路復(fù)用、事件通知機(jī)制、信號(hào)驅(qū)動(dòng)I/O和異步I/O等技術(shù),同時(shí)簡(jiǎn)要介紹了Redis的通信協(xié)議RESP
    2025-12-12
  • Redis實(shí)現(xiàn)庫(kù)存扣減的解決方案防止商品超賣

    Redis實(shí)現(xiàn)庫(kù)存扣減的解決方案防止商品超賣

    在日常開發(fā)中有很多地方都有類似扣減庫(kù)存的操作,比如電商系統(tǒng)中的商品庫(kù)存,抽獎(jiǎng)系統(tǒng)中的獎(jiǎng)品庫(kù)存等,基于redis實(shí)現(xiàn)扣減庫(kù)存的具體實(shí)現(xiàn),初始化庫(kù)存回調(diào)函數(shù)(IStockCallback)扣減庫(kù)存服務(wù)(StockService),感興趣的朋友跟隨小編一起看看吧
    2022-06-06
  • 基于Redis實(shí)現(xiàn)阻塞隊(duì)列的方式

    基于Redis實(shí)現(xiàn)阻塞隊(duì)列的方式

    本文主要講解基于?Redis?的方式實(shí)現(xiàn)異步隊(duì)列,基于?Redis?的?list?實(shí)現(xiàn)隊(duì)列的方式也有多種,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹

    Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹

    本文主要介紹了Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot集成Redis的思路詳解

    SpringBoot集成Redis的思路詳解

    Redis是一個(gè)開源的使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。接下來(lái)通過本文給大家分享SpringBoot集成Redis的詳細(xì)過程,感興趣的朋友一起看看吧
    2021-10-10
  • Redis自增生成id的方法實(shí)踐

    Redis自增生成id的方法實(shí)踐

    在使用Redis時(shí),常常需要用到自增ID的功能,主要介紹了Redis自增生成id的方法實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 詳解在Redis在Centos7上的安裝部署

    詳解在Redis在Centos7上的安裝部署

    Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)。這篇文章主要介紹了詳解在Redis在Centos7上的安裝部署,有興趣的可以了解一下。
    2016-12-12
  • RedisTemplate訪問Redis的更好方法

    RedisTemplate訪問Redis的更好方法

    這篇文章主要為大家介紹了RedisTemplate訪問Redis的更好方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • ELK配置轉(zhuǎn)存redis緩存采集nginx訪問日志的操作方法

    ELK配置轉(zhuǎn)存redis緩存采集nginx訪問日志的操作方法

    本文介紹了在服務(wù)器上部署MySQL及如何啟動(dòng)MySQL服務(wù),并詳細(xì)說明了如何查找安裝軟件的日志文件位置,通過使用rpm命令查詢MySQL服務(wù)的日志文件位置,以及通過編輯Logstash配置文件來(lái)添加MySQL日志信息,感興趣的朋友一起看看吧
    2024-11-11

最新評(píng)論

嵊泗县| 普兰县| 彝良县| 法库县| 利川市| 绥宁县| 崇信县| 镇坪县| 肃宁县| 龙里县| 成安县| 洞口县| 彭阳县| 仪陇县| 南城县| 土默特右旗| 深州市| 基隆市| 灌云县| 崇文区| 保靖县| 长春市| 泉州市| 巍山| 苏尼特左旗| 东阳市| 中阳县| 石嘴山市| 罗江县| 吕梁市| 鄂托克旗| 开鲁县| 托里县| 杭锦后旗| 翁牛特旗| 二连浩特市| 汤原县| 靖宇县| 南安市| 洪雅县| 阿荣旗|