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

Redis 緩存滿了如何解決

 更新時(shí)間:2023年08月23日 08:51:32   作者:Genius Kim  
Redis 緩存使用內(nèi)存來保存數(shù)據(jù),隨著需要緩存的數(shù)據(jù)量越來越大,有限的緩存空間不可避免地會(huì)被寫滿,本文主要介紹了Redis 緩存滿了如何解決,感興趣的可以了解一下

引言

Redis 緩存使用內(nèi)存來保存數(shù)據(jù),隨著需要緩存的數(shù)據(jù)量越來越大,有限的緩存空間不可避免地會(huì)被寫滿。此時(shí),應(yīng)該怎么辦?本篇文章接下來就來聊聊緩存滿了之后的數(shù)據(jù)淘汰機(jī)制。

值得注意的是,在 Redis 中 過期策略 和 內(nèi)存淘汰策略 是兩個(gè)完全不同的概念。Redis 過期策略指的是 Redis 使用哪種策略,來刪除已經(jīng)過期的鍵值對(duì);而內(nèi)存淘汰機(jī)制指的是當(dāng) Redis 運(yùn)行內(nèi)存已經(jīng)超過設(shè)置的最大內(nèi)存之后,將采用什么策略來刪除符合條件的鍵值對(duì),以此來保障 Redis 高效的運(yùn)行。

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

只有在 Redis 的運(yùn)行內(nèi)存達(dá)到了某個(gè)閥值,才會(huì)觸發(fā)內(nèi)存淘汰機(jī)制,這個(gè)閥值就是我們?cè)O(shè)置的最大運(yùn)行內(nèi)存,此值在 Redis 的配置文件中可以找到,配置項(xiàng)為 maxmemory。

內(nèi)存淘汰執(zhí)行流程,如下圖所示:

查詢最大運(yùn)行內(nèi)存

我們可以使用命令 config get maxmemory 來查看設(shè)置的最大運(yùn)行內(nèi)存,命令如下:

127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"

我們發(fā)現(xiàn)此值竟然是 0,這是 64 位操作系統(tǒng)默認(rèn)的值,當(dāng) maxmemory 為 0 時(shí),表示沒有內(nèi)存大小限制。

注意:32 位操作系統(tǒng),默認(rèn)的最大內(nèi)存值是 3GB。

內(nèi)存淘汰策略

查看 Redis 內(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)存淘汰機(jī)制,它表示當(dāng)運(yùn)行內(nèi)存超過最大設(shè)置內(nèi)存時(shí),不淘汰任何數(shù)據(jù),但新增操作會(huì)報(bào)錯(cuò)。

內(nèi)存淘汰策略分類

早期版本的 Redis 有以下 6 種淘汰策略:

  • noeviction:不淘汰任何數(shù)據(jù),當(dāng)內(nèi)存不足時(shí),新增操作會(huì)報(bào)錯(cuò),Redis 默認(rèn)內(nèi)存淘汰策略;
  • allkeys-lru:淘汰整個(gè)鍵值中最久未使用的鍵值;
  • allkeys-random:隨機(jī)淘汰任意鍵值;
  • volatile-lru:淘汰所有設(shè)置了過期時(shí)間的鍵值中最久未使用的鍵值;
  • volatile-random:隨機(jī)淘汰設(shè)置了過期時(shí)間的任意鍵值;
  • volatile-ttl:優(yōu)先淘汰更早過期的鍵值。

在 Redis 4.0 版本中又新增了 2 種淘汰策略:

  • volatile-lfu:淘汰所有設(shè)置了過期時(shí)間的鍵值中,最少使用的鍵值;
  • allkeys-lfu:淘汰整個(gè)鍵值中最少使用的鍵值。

其中 allkeys-xxx 表示從所有的鍵值中淘汰數(shù)據(jù),而 volatile-xxx 表示從設(shè)置了過期鍵的鍵值中淘汰數(shù)據(jù)。

修改 Redis 內(nèi)存淘汰策略

設(shè)置內(nèi)存淘汰策略有兩種方法,這兩種方法各有利弊,需要使用者自己去權(quán)衡。

  • 方式一:通過“config set maxmemory-policy 策略”命令設(shè)置。它的優(yōu)點(diǎn)是設(shè)置之后立即生效,不需要重啟 Redis 服務(wù),缺點(diǎn)是重啟 Redis 之后,設(shè)置就會(huì)失效。
  • 方式二:通過修改 Redis 配置文件修改,設(shè)置“maxmemory-policy 策略”,它的優(yōu)點(diǎn)是重啟 Redis 服務(wù)后配置不會(huì)丟失,缺點(diǎn)是必須重啟 Redis 服務(wù),設(shè)置才能生效。

內(nèi)存淘汰算法

從內(nèi)存淘汰策略分類上,我們可以得知,除了隨機(jī)刪除和不刪除之外,主要有兩種淘汰算法:LRU 算法 和 LFU 算法。

LRU 算法

LRU 全稱是 Least Recently Used 譯為最近最少使用,是一種常用的頁(yè)面置換算法,選擇最近最久未使用的頁(yè)面予以淘汰。

1. LRU 算法實(shí)現(xiàn)

LRU 算法需要基于鏈表結(jié)構(gòu),鏈表中的元素按照操作順序從前往后排列,最新操作的鍵會(huì)被移動(dòng)到表頭,當(dāng)需要內(nèi)存淘汰時(shí),只需要?jiǎng)h除鏈表尾部的元素即可。

2. 近 LRU 算法

Redis 使用的是一種近似 LRU 算法,目的是為了更好的節(jié)約內(nèi)存,它的實(shí)現(xiàn)方式是給現(xiàn)有的數(shù)據(jù)結(jié)構(gòu)添加一個(gè)額外的字段,用于記錄此鍵值的最后一次訪問時(shí)間,Redis 內(nèi)存淘汰時(shí),會(huì)使用隨機(jī)采樣的方式來淘汰數(shù)據(jù),它是隨機(jī)取 5 個(gè)值(此值可配置),然后淘汰最久沒有使用的那個(gè)。

3. LRU 算法缺點(diǎn)

LRU 算法有一個(gè)缺點(diǎn),比如說很久沒有使用的一個(gè)鍵值,如果最近被訪問了一次,那么它就不會(huì)被淘汰,即使它是使用次數(shù)最少的緩存,那它也不會(huì)被淘汰,因此在 Redis 4.0 之后引入了 LFU 算法,下面我們一起來看。

LFU 算法

LFU 全稱是 Least Frequently Used 翻譯為最不常用的,最不常用的算法是根據(jù)總訪問次數(shù)來淘汰數(shù)據(jù)的,它的核心思想是“如果數(shù)據(jù)過去被訪問多次,那么將來被訪問的頻率也更高”。

LFU 解決了偶爾被訪問一次之后,數(shù)據(jù)就不會(huì)被淘汰的問題,相比于 LRU 算法也更合理一些。

在 Redis 中每個(gè)對(duì)象頭中記錄著 LFU 的信息,源碼如下:

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;
    void *ptr;
} robj;

在 Redis 中 LFU 存儲(chǔ)分為兩部分,16 bit 的 ldt(last decrement time)和 8 bit 的 logc(logistic counter)。

  • logc 是用來存儲(chǔ)訪問頻次,8 bit 能表示的最大整數(shù)值為 255,它的值越小表示使用頻率越低,越容易淘汰;
  • ldt 是用來存儲(chǔ)上一次 logc 的更新時(shí)間。

總結(jié)

綜上所述我們了解到,Redis 內(nèi)存淘汰策略和過期回收策略是完全不同的概念,內(nèi)存淘汰策略是解決 Redis 運(yùn)行內(nèi)存過大的問題的,通過與 maxmemory 比較,決定要不要淘汰數(shù)據(jù),根據(jù) maxmemory-policy 參數(shù),決定使用何種淘汰策略,在 Redis 4.0 之后已經(jīng)有 8 種 淘汰策略了,默認(rèn)的策略是 noeviction 當(dāng)內(nèi)存超出時(shí)不淘汰任何鍵值,只是新增操作會(huì)報(bào)錯(cuò)。

到此這篇關(guān)于Redis 緩存滿了如何解決的文章就介紹到這了,更多相關(guān)Redis 緩存滿了內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis集群Lettuce主從切換問題解決方案

    Redis集群Lettuce主從切換問題解決方案

    這篇文章主要為大家介紹了Redis集群Lettuce主從切換問題解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 詳解redis中的下載和安裝(最新推薦)

    詳解redis中的下載和安裝(最新推薦)

    本文詳細(xì)介紹了如何在Linux和Docker上安裝、配置、啟動(dòng)和關(guān)閉Redis,包括下載安裝包、解壓、編譯安裝、配置文件修改、前臺(tái)和后臺(tái)啟動(dòng)、關(guān)閉以及Docker容器化部署等步驟,感興趣的朋友一起看看吧
    2025-03-03
  • Redis搭建哨兵集群實(shí)踐

    Redis搭建哨兵集群實(shí)踐

    本文介紹了從零搭建一個(gè)1主+2從+3哨兵的高可用Redis架構(gòu),并驗(yàn)證故障轉(zhuǎn)移效果,文中詳細(xì)描述了環(huán)境準(zhǔn)備、搭建Redis主從復(fù)制、配置哨兵集群、驗(yàn)證哨兵集群狀態(tài)以及模擬故障轉(zhuǎn)移的步驟,最后,還提供了在生產(chǎn)環(huán)境中的最佳實(shí)踐和常見問題排查建議
    2026-04-04
  • Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí)

    Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí)

    這篇文章主要為大家介紹了Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Redis如何使用HyperLogLog的實(shí)現(xiàn)

    Redis如何使用HyperLogLog的實(shí)現(xiàn)

    本文主要介紹了Redis如何使用HyperLogLog的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis實(shí)現(xiàn)分布式限流的幾種方法

    Redis實(shí)現(xiàn)分布式限流的幾種方法

    Redis實(shí)現(xiàn)分布式限流能有效防止系統(tǒng)過載,,可以防止系統(tǒng)過載并確保公平的資源分配,主要算法包括固定窗口、滑動(dòng)窗口和令牌桶,具有一定的參考價(jià)值,感興趣的可以了解一下
    2026-01-01
  • Redis 數(shù)據(jù)類型Streams詳解

    Redis 數(shù)據(jù)類型Streams詳解

    Redis Streams是Redis 5.0新增的數(shù)據(jù)類型,提供了一種日志結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)方式,這種類型適合用于構(gòu)建消息隊(duì)列、事件日志和處理時(shí)間序列數(shù)據(jù)的應(yīng)用,本文介紹Redis 數(shù)據(jù)類型Streams相關(guān)知識(shí),感興趣的朋友一起看看吧
    2024-10-10
  • 如何打造redis緩存組件

    如何打造redis緩存組件

    文章介紹了如何使用熱插拔AOP、反射、Redis自定義注解和SpringEL表達(dá)式來打造一個(gè)優(yōu)雅的Redis緩存組件,通過這種方式,可以重構(gòu)和簡(jiǎn)化緩存代碼,并提供了Redis配置和自定義注解的詳細(xì)說明,文章還包含了AOP測(cè)試的總結(jié),并鼓勵(lì)讀者參考和支持
    2024-12-12
  • Redis大Key問題識(shí)別、處理與預(yù)防全攻略

    Redis大Key問題識(shí)別、處理與預(yù)防全攻略

    Redis中的大Key就像血管中的血栓——單個(gè)Key過大(如100MB)會(huì)導(dǎo)致內(nèi)存不均、操作阻塞、集群崩潰,必須及時(shí)溶栓,所以本文給大家介紹了Redis大Key問題識(shí)別、處理與預(yù)防全攻略,需要的朋友可以參考下
    2025-08-08
  • Windows系統(tǒng)一鍵啟動(dòng)Redis腳本

    Windows系統(tǒng)一鍵啟動(dòng)Redis腳本

    本文介紹了在Windows系統(tǒng)中創(chuàng)建一鍵啟動(dòng)Redis的腳本,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12

最新評(píng)論

贵溪市| 昭觉县| 连山| 涞源县| 正阳县| 临漳县| 南漳县| 洞头县| 罗定市| 洪江市| 广东省| 社会| 浦县| 光泽县| 丰原市| 平乐县| 措勤县| 富锦市| 安义县| 新河县| 鄂尔多斯市| 南江县| 清涧县| 麻栗坡县| 游戏| 维西| 民县| 理塘县| 平邑县| 醴陵市| 磐石市| 仙游县| 阳西县| 辛集市| 泾川县| 南康市| 桂东县| 文登市| 镶黄旗| 嘉黎县| 贵阳市|