摘要:但是內(nèi)存空間畢竟有限,隨著我們存儲數(shù)據(jù)的不斷增長,要緩存的數(shù)據(jù)量越來越大,當(dāng)超過了我們的內(nèi)存大小時,該怎么辦呢解決方法有兩種增加物理內(nèi)存搭建集群和緩存數(shù)據(jù)的淘汰機(jī)制。增加物理內(nèi)存簡單粗暴,價格十分昂貴,內(nèi)存的價格大約是萬元左右。
redis 使用的時內(nèi)存空間來存儲數(shù)據(jù)的,避免業(yè)務(wù)應(yīng)用從后端數(shù)據(jù)庫中讀取數(shù)據(jù),可以提升應(yīng)用的響應(yīng)速度。但是內(nèi)存空間畢竟有限,隨著我們存儲數(shù)據(jù)的不斷增長,要緩存的數(shù)據(jù)量越來越大,當(dāng)超過了我們的內(nèi)存大小時,該怎么辦呢?
解決方法有兩種:增加物理內(nèi)存、搭建 Redis 集群和緩存數(shù)據(jù)的淘汰機(jī)制。增加物理內(nèi)存簡單粗暴,價格十分昂貴,1TB 內(nèi)存的價格大約是 4 萬元左右。所以我們選擇緩存數(shù)據(jù)的淘汰機(jī)制。使用簡單來說,數(shù)據(jù)淘汰機(jī)制包括兩步:第一,根據(jù)一定的策略,篩選出對應(yīng)用訪問來說"不重要"的數(shù)據(jù);第二,將這些數(shù)據(jù)從緩存中刪除,為新來的數(shù)據(jù)騰出空間。
在 Redis 的配置文件redis.conf
文件中,配置maxmemory
的大小參數(shù)如下所示:
maxmemory 4gb
# 使用以下命令配置 maxmemory
CONFIG SET maxmemory 4gb
倘若實際的存儲中超出了 Redis 的配置參數(shù)的大小時,Redis 中有淘汰策略,把需要淘汰的 key 給淘汰掉,整理出干凈的一塊內(nèi)存給新的 key 值使用。
Redis 4.0 之前一共實現(xiàn)了 6 種內(nèi)存淘汰策略,在 4.0 之后,又增加了 2 種策略。我們可以按照是否會進(jìn)行數(shù)據(jù)淘汰把它們分成兩類:
會進(jìn)行淘汰的 7 種其他策略。會進(jìn)行淘汰的 7 種策略,我們可以再進(jìn)一步根據(jù)淘汰候選數(shù)據(jù)集的范圍把它們分成兩類:
規(guī)則 | 規(guī)則說明 |
---|---|
noeviction | 當(dāng)內(nèi)存不足以容納新寫入的數(shù)據(jù)時 新寫入操作會報錯 |
allkeys-lru | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時 在鍵空間中 移除最近最少使用的 key |
allkeys-random | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時 在鍵空間中 隨機(jī)移除某個 key |
volatile-lru | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時 在設(shè)置了過期時間的鍵空間中 移除最近最少使用的 key |
nvolatile-lru | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時 在設(shè)置了過期時間的鍵空間中 移除最近最少使用的 key |
volatile-ttl | 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時 在設(shè)置了過期時間的鍵空間中 有更早過期時間的 key 優(yōu)先移除 |
默認(rèn)情況下,Redis 在使用的內(nèi)存空間超過 maxmemory 值時,并不會淘汰數(shù)據(jù),也就是設(shè)定的 noeviction 策略。對應(yīng)到 Redis 緩存,也就是指,一旦緩存被寫滿了,再有寫請求來時,Redis 不再提供服務(wù),而是直接返回錯誤。Redis 用作緩存時,實際的數(shù)據(jù)集通常都是大于緩存容量的,總會有新的數(shù)據(jù)要寫入緩存,這個策略本身不淘汰數(shù)據(jù),也就不會騰出新的緩存空間,我們不把它用在 Redis 緩存中。
例如,我們使用 EXPIRE 命令對一批鍵值對設(shè)置了過期時間后,無論是這些鍵值對的過期時間是快到了,還是 Redis 的內(nèi)存使用量達(dá)到了 maxmemory 閾值,Redis 都會進(jìn)一步按照 volatile-ttl、volatile-random、volatile-lru、volatile-lfu 這四種策略的具體篩選規(guī)則進(jìn)行淘汰。
可以看到,volatile-ttl 和 volatile-random 篩選規(guī)則比較簡單,而 volatile-lru 因為涉及了 LRU 算法,所以我會在分析 allkeys-lru 策略時再詳細(xì)解釋。volatile-lfu 使用了 LFU 算法,我會在第 26 講中具體解釋,現(xiàn)在你只需要知道,它是在 LRU 算法的基礎(chǔ)上,同時考慮了數(shù)據(jù)的訪問時效性和數(shù)據(jù)的訪問次數(shù),可以看作是對淘汰策略的優(yōu)化。
相對于 volatile-ttl、volatile-random、volatile-lru、volatile-lfu 這四種策略淘汰的是設(shè)置了過期時間的數(shù)據(jù),allkeys-lru、allkeys-random、allkeys-lfu 這三種淘汰策略的備選淘汰數(shù)據(jù)范圍,就擴(kuò)大到了所有鍵值對,無論這些鍵值對是否設(shè)置了過期時間。它們篩選數(shù)據(jù)進(jìn)行淘汰的規(guī)則是:
這也就是說,如果一個鍵值對被刪除策略選中了,即使它的過期時間還沒到,也需要被刪除。當(dāng)然,如果它的過期時間到了但未被策略選中,同樣也會被刪除。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/126009.html
摘要:分布式緩存應(yīng)用和緩存分離,緩存單獨作為一個系統(tǒng)單獨部署,多個應(yīng)用可以共享的訪問緩存。通過靜態(tài)變量一次獲取所有的數(shù)據(jù)緩存起來避免頻繁的讀取。類似的分布式緩存實現(xiàn)方案還有的集群方案,其實現(xiàn)思想和的實現(xiàn)思想大相徑庭。 0x01 前言 提到緩存,那么緩存是什么,為什么需要緩存? 如果知道一點點計算機(jī)方面的知識就會知道,計算機(jī)的構(gòu)造也是由多級緩存->硬盤一起來構(gòu)造計算機(jī)的數(shù)據(jù)存儲。當(dāng)然這里不是來...
摘要:分布式緩存應(yīng)用和緩存分離,緩存單獨作為一個系統(tǒng)單獨部署,多個應(yīng)用可以共享的訪問緩存。通過靜態(tài)變量一次獲取所有的數(shù)據(jù)緩存起來避免頻繁的讀取。類似的分布式緩存實現(xiàn)方案還有的集群方案,其實現(xiàn)思想和的實現(xiàn)思想大相徑庭。 0x01 前言 提到緩存,那么緩存是什么,為什么需要緩存? 如果知道一點點計算機(jī)方面的知識就會知道,計算機(jī)的構(gòu)造也是由多級緩存->硬盤一起來構(gòu)造計算機(jī)的數(shù)據(jù)存儲。當(dāng)然這里不是來...
摘要:的過期策略是什么樣的采用了定期刪除惰性刪除的過期策略。定期刪除原理定期刪除指的是默認(rèn)每隔就隨機(jī)抽取一些設(shè)置了過期時間的,檢測這些是否過期,如果過期了就將其刪掉。所有只會抽取一部分而不會全部檢查。 1.數(shù)據(jù)為什么會過期? 首先,要明白redis是用來做數(shù)據(jù)緩存的,不是用來做數(shù)據(jù)存儲的(當(dāng)然也可以當(dāng)數(shù)據(jù)庫用),所以數(shù)據(jù)時候過期的,過期的數(shù)據(jù)就不見了,過期主要有兩種情況, ①在設(shè)置緩存數(shù)據(jù)時制定了...
閱讀 3546·2023-04-25 20:09
閱讀 3745·2022-06-28 19:00
閱讀 3066·2022-06-28 19:00
閱讀 3092·2022-06-28 19:00
閱讀 3185·2022-06-28 19:00
閱讀 2886·2022-06-28 19:00
閱讀 3057·2022-06-28 19:00
閱讀 2644·2022-06-28 19:00