Redis記憶體管理和優化02

2021-09-11 22:42:07 字數 4103 閱讀 7347

好好整理了一下關於reids記憶體優化的知識,總算對redis記憶體管理有了乙個初步的認識。

一.記憶體消耗分析

redis程序內消耗主要包括:自身記憶體+物件記憶體+緩衝記憶體+記憶體碎片,其中redis空程序自身記憶體消耗非常少,通常used_memory_rss在3mb左右,used_memory在800kb左右,乙個空的redis程序消耗記憶體可以忽略不計。

1.物件記憶體

資料都採用key-value資料型別,每次建立鍵值對時,至少建立兩個型別物件:key物件和value物件。物件記憶體消耗可以簡單理解為sizeofkeys+sizeofvalues)。鍵物件都是字串,在使用redis時很容易忽略鍵對記憶體消耗的影響,應當避免使用過長的鍵。

2.緩衝記憶體

緩衝記憶體主要包括:客戶端緩衝、複製積壓緩衝區、aof緩衝區。

3.記憶體碎片

比如當儲存5kb物件時jemalloc可能會採用8kb的塊儲存,而剩下的3kb空間變為了記憶體碎片不能再分配給其他物件儲存。記憶體碎片問題雖然是所有記憶體服務的通病,但是jemalloc針對碎片化問題專門做了優化,一般不會存在過度碎片化的問題,正常的碎片率(mem_fragmentation_ratio)在1.03左右。

4.子程序記憶體消耗問題

redis產生的子程序並不需要消耗1倍的父程序記憶體,實際消耗根據期間寫入命令量決定,但是依然要預留出一些記憶體防止溢位。

二.記憶體管理

1.限制記憶體使用上限

2.記憶體**策略

redis的記憶體**機制主要體現在以下兩個方面:

·     刪除到達過期時間的鍵物件。

·      

記憶體使用達到maxmemory上限時觸發記憶體溢位控制策略。

3.刪除過期的健

redis所有的鍵都可以設定過期屬性,內部儲存在過期字典中。由於程序內儲存大量的鍵,維護每個鍵精準的過期刪除機制會導致消耗大量的cpu,對於單執行緒的redi來說成本過高,因此redis採用惰性刪除和定時任務刪除機制實現過期鍵的記憶體**。

惰性刪除:。

正因為如此

,redis還提供另一種定時任務刪除機制作為惰性刪除的補充。

定時任務刪除:redis內部維護乙個定時任務,預設每秒執行10次(通過配置hz控制)。

定時任務中刪除過期鍵邏輯採用了自適應演算法,根據鍵的過期比例、使用快慢兩種速率模式**鍵。

4.定時刪除key策略

流程說明:

1)定時任務在每個資料庫空間隨機檢查

20個鍵,當發現過期時刪除對應的鍵。

2)如果超過檢查數

25%的鍵過期,迴圈執行**邏輯直到不足

25%或執行超時為止,慢模式下超時時間為

25毫秒。 3

)如果之前**鍵邏輯超時,則在

redis

觸發內部事件之前再次以快模式執行**過期鍵任務,快模式下超時時間為

1毫秒且

2秒內只能執行1次。

三.記憶體優化

2.共享記憶體池

共享物件池是指redis內部維護[0-9999]的整數物件池。無論使用多少次0-9999中的整數,只占用乙份0-9999的記憶體。

3.hash結構記憶體優化與關鍵點

同樣的資料使用ziplist編碼的hash型別儲存比string型別節約記憶體。

·節省記憶體量隨著value空間的減少越來越明顯。

·hash-ziplist型別比string型別寫入

耗時,但隨著value空間的減少,耗時逐漸降低。

4.hash結構健的設計

·1)當鍵離散度較高時,可以按字串位擷取,把後三位作為雜湊的field,之前部分作為雜湊的鍵。如:key=1948480雜湊key=group:hash:1948,雜湊field=480。

2)當鍵離散度較低時,可以使用雜湊演算法打散鍵,如:使用

crc32

(key

)&10000

函式把所有的鍵對映到「

0-9999」

整數範圍內,雜湊

field

儲存鍵的原始值。

5.使用hash結構需要提前規避的問題 ·

客戶端需要預估鍵的規模並設計hash分組規則,加重客戶端開發成本。

·hash重構後所有的鍵無法再使用超時(expire)和lru淘汰機制自動刪除,需要手動維護刪除。

·對於大物件,如1kb以上的物件,使用hash-ziplist結構控制鍵數量反而得不償失。 不過

瑕不掩瑜,對於大量小物件的儲存場景,非常適合使用ziplist編碼的hash型別控制鍵的規模來降低記憶體。

使用ziplist+hash優化keys後,如果想使用超時刪除功能,開發人員可以儲存每個物件寫入的時間,再通過定時任務使用hscan命令掃瞄資料,找出hash內超時的資料項刪除即可。

總結:

1redis實際記憶體消耗主要包括:鍵值物件、緩衝區記憶體、記憶體碎片

2)通過調整maxmemory控制redis最大可用記憶體。當記憶體使用超出時,根據maxmemory-policy控制記憶體**策略。

3)記憶體是相對寶貴的資源,通過合理的優化可以有效地降低記憶體的使用量,記憶體優化的思路包括

·精簡鍵值對大小,鍵值字面量精簡,使用高效二進位制序列化工具

·使用物件共享池優化小整數物件。·資料優先使用整數,比字串型別更節省空間

·優化字串使用,避免預分配造成的記憶體浪費

·使用ziplist壓縮編碼優化hashlist等結構,注重效率和空間的平衡。·使用intset編碼優化整數集合

·使用ziplist編碼的hash結構降低小物件鏈規模。

Redis的記憶體管理和優化

used memory 已經使用了的記憶體大小,包括redis程序內部開銷和你的cache的資料所占用的記憶體,單位byte。used memory human 以可讀格式返回的used memory。used memory rss 從作業系統角度顯示的redis占用的物理記憶體。used memo...

Redis 記憶體優化

非常感謝 redis內部有很多的資料型別,這些在官方文件上都可以看到,下面是其內部優化的一些細節點 1.string 和 數字,在redis中如果儲存的是 123 redis是能夠識別出來這是乙個數字並且按照數字來儲存,節省儲存空間,當然除了這個優化之外,redis內部會構建乙個數字池,預設是100...

redis記憶體優化

在資料量小或者只有int資料的時候,redis採用更緊湊的資料結構來儲存資料 zset hash ziplist set int intset 這些特殊的資料結構是一整塊記憶體,避免來記憶體分片,節省了記憶體,並且增加了cache命中,所以雖然演算法複雜度變成了on,但其實更快了 對於只需要flag...