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

Redis 緩存滿了如何解決

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

引言

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

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

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

只有在 Redis 的運行內(nèi)存達到了某個閥值,才會觸發(fā)內(nèi)存淘汰機制,這個閥值就是我們設(shè)置的最大運行內(nèi)存,此值在 Redis 的配置文件中可以找到,配置項為 maxmemory。

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

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

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

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

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

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

內(nèi)存淘汰策略

查看 Redis 內(nèi)存淘汰策略

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

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

可以看出此 Redis 使用的是 noeviction 類型的內(nèi)存淘汰機制,它表示當運行內(nèi)存超過最大設(shè)置內(nèi)存時,不淘汰任何數(shù)據(jù),但新增操作會報錯。

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

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

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

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

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

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

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

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

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

內(nèi)存淘汰算法

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

LRU 算法

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

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

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

2. 近 LRU 算法

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

3. LRU 算法缺點

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

LFU 算法

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

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

在 Redis 中每個對象頭中記錄著 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 存儲分為兩部分,16 bit 的 ldt(last decrement time)和 8 bit 的 logc(logistic counter)。

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

總結(jié)

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

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

相關(guān)文章

  • Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    這篇文章主要介紹了Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié),本文分別對String 類型的一些方法和Hash 類型做了詳細介紹,需要的朋友可以參考下
    2015-06-06
  • Redis模仿發(fā)送手機驗證碼功能

    Redis模仿發(fā)送手機驗證碼功能

    這篇文章主要介紹了Redis模仿手機驗證碼發(fā)送功能,通過示例代碼給大家講解通過用戶輸入手機號以及驗證碼進行校驗,代碼簡單易懂,需要的朋友可以參考下
    2021-09-09
  • Redis哨兵模式的實現(xiàn)

    Redis哨兵模式的實現(xiàn)

    Redis的哨兵模式是一種用于自動監(jiān)控Redis實例狀態(tài)并在主服務(wù)器出現(xiàn)故障時自動切換到從服務(wù)器的機制,本文主要介紹了Redis哨兵模式的實現(xiàn),感興趣的可以了解一下
    2024-02-02
  • React實現(xiàn)組件之間通信的幾種常用方法

    React實現(xiàn)組件之間通信的幾種常用方法

    在?React?中,組件之間的通信是構(gòu)建復(fù)雜應(yīng)用程序的核心部分,良好的組件間通信能夠提高代碼的可維護性和可讀性,同時能夠高效地管理應(yīng)用狀態(tài),在這篇博客中,我們將探討?React中幾種常用的組件通信方法,并提供示例代碼來幫助你理解,需要的朋友可以參考下
    2025-02-02
  • 深入理解Redis被覆寫后的失效時間

    深入理解Redis被覆寫后的失效時間

    Redis覆寫已存在的鍵會導(dǎo)致其舊的失效時間被新的鍵值對所取代,本文詳細解析了在鍵被覆寫時,其失效時間的變化,具有一定的參考價值,感興趣的可以了解一下
    2024-09-09
  • Redis Redisson lock和tryLock的原理分析

    Redis Redisson lock和tryLock的原理分析

    這篇文章主要介紹了Redis Redisson lock和tryLock的原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Redis消息隊列實現(xiàn)異步秒殺功能

    Redis消息隊列實現(xiàn)異步秒殺功能

    在高并發(fā)場景下,為了提高秒殺業(yè)務(wù)的性能,可將部分工作交給 Redis 處理,并通過異步方式執(zhí)行,Redis 提供了多種數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)消息隊列,總結(jié)三種,本文詳細介紹Redis消息隊列實現(xiàn)異步秒殺功能,感興趣的朋友一起看看吧
    2025-04-04
  • Redis Cluster集群數(shù)據(jù)分片機制原理

    Redis Cluster集群數(shù)據(jù)分片機制原理

    這篇文章主要介紹了Redis Cluster集群數(shù)據(jù)分片機制原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 深入解析Redis的LRU與LFU算法實現(xiàn)

    深入解析Redis的LRU與LFU算法實現(xiàn)

    這篇文章主要重點介紹了Redis的LRU與LFU算法實現(xiàn),并分析總結(jié)了兩種算法的實現(xiàn)效果以及存在的問題,并闡述其優(yōu)劣特性,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • 微服務(wù)Spring Boot 整合 Redis 實現(xiàn)好友關(guān)注功能

    微服務(wù)Spring Boot 整合 Redis 實現(xiàn)好友關(guān)注功能

    這篇文章主要介紹了微服務(wù)Spring Boot 整合 Redis 實現(xiàn) 好友關(guān)注,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12

最新評論