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