8.1 記憶體消耗
物件記憶體
物件記憶體是redis記憶體占用最大的一塊,儲存著使用者所有的資料。redis所有的資料都採用key-value資料型別,每次建立鍵值對時,至少建立兩個型別物件:key物件和value物件。物件記憶體消耗可以簡單理解為sizeof(keys)+sizeof(values)。鍵物件都是字串,在使用redis時很容易忽略鍵對記憶體消耗的影響,應當避免使用過長的鍵,value物件更複雜些,主要包含5種基本資料型別:字串、列表、雜湊、集合、有序集合。其他資料型別都是建立在這5種資料結構之上實現的,每種value物件型別根據使用規模不同,占用記憶體不同。在使用時一定要合理預估並監控value物件占用情況,避免記憶體溢位。
緩衝記憶體
2.1緩衝記憶體主要包括:客戶端緩衝、複製積壓緩衝區、aof緩衝區。
客戶端緩衝指的是所有接入到redis伺服器tcp連線的輸入輸出緩衝。輸入緩衝無法控制,最大空間為1g,如果超過將斷開連線。輸出緩衝通過引數client-output-buffer-limit控制
2.2複製積壓緩衝區:redis在2.8版本之後提供了乙個可重用的固定大小緩衝區用於實現部分複製功能,根據repl-backlog-size引數控制,預設1mb。對於複製積壓緩衝區整個主節點只有乙個,所有的從節點共享此緩衝區,因此可以設定較大的緩衝區空間,如100mb,這部分記憶體投入是有價值的,可以有效避免全量複製
2.3aof緩衝區:這部分空間用於在redis重寫期間儲存最近的寫入命令,具體細節見5.2節。aof緩衝區空間消耗使用者無法控制,消耗的記憶體取決於aof重寫時間和寫入命令量,這部分空間占用通常很小。
記憶體碎片
8.2 記憶體管理
8.2.1設定記憶體上限
·用於快取場景,當超出記憶體上限maxmemory時使用lru等刪除策略釋放空間。
·防止所用記憶體超過伺服器物理記憶體。
8.2.2 動態調整記憶體上限
redis的記憶體上限可以通過config set maxmemory進行動態修改,即修改最大可用記憶體
8.2.3 記憶體**策略
redis的記憶體**機制主要體現在以下兩個方面:
刪除到達過期時間的鍵物件。
定時任務刪除:redis內部維護乙個定時任務,預設每秒執行10次(通過配置hz控制)。定時任務中刪除過期鍵邏輯採用了自適應演算法,根據鍵的過期比例、使用快慢兩種速率模式**鍵
1.定時任務在每個資料庫空間隨機檢查20個鍵,當發現過期時刪除對應的鍵。
2.如果超過檢查數25%的鍵過期,迴圈執行**邏輯直到不足25%或執行超時為止,慢模式下超時時間為25毫秒。
3.如果之前**鍵邏輯超時,則在redis觸發內部事件之前再次以快模式執行**過期鍵任務,快模式下超時時間為1毫秒且2秒內只能執行1次。
4.快慢兩種模式內部刪除邏輯相同,只是執行的超時時間不同。
2.記憶體溢位控制策略
當redis所用記憶體達到maxmemory上限時會觸發相應的溢位控制策略。具體策略受maxmemory-policy引數控制,redis支援6種策略,如
1)noeviction:預設策略,不會刪除任何資料,拒絕所有寫入操作並返回客戶端錯誤資訊(error)oom command not allowed when used memory,此時redis只響應讀操作
2)volatile-lru:根據lru演算法刪除設定了超時屬性(expire)的鍵,直到騰出足夠空間為止。如果沒有可刪除的鍵物件,回退到noeviction策略。
3)allkeys-lru:根據lru演算法刪除鍵,不管資料有沒有設定超時屬性,直到騰出足夠空間為止。
4)allkeys-random:隨機刪除所有鍵,直到騰出足夠空間為止。
5)volatile-random:隨機刪除過期鍵,直到騰出足夠空間為止。
6)volatile-ttl:根據鍵值物件的ttl屬性,刪除最近將要過期資料。如果沒有,回退到noeviction策略
8.3 記憶體優化
·優化字串使用,避免預分配造成的記憶體浪費,見需求是把業務物件序列化成二進位制陣列放入redis
編碼優化,不同編碼實現效率和空間的平衡
我們的儲存只有10個元素的列表,當使用雙向鍊錶資料結構時,必然需要維護大量的內部欄位如每個元素需要:前置指標,後置指標,資料指標等,造成空間浪費,如果採用連續記憶體結構的壓縮列表(ziplist),將會節省大量記憶體,而由於資料長度較小
控制鍵的數量
8.4 本章重點回顧
1)redis實際記憶體消耗主要包括:鍵值物件、緩衝區記憶體、記憶體碎片。
2)通過調整maxmemory控制redis最大可用記憶體。當記憶體使用超出時,
根據maxmemory-policy控制記憶體**策略。
3)記憶體是相對寶貴的資源,通過合理的優化可以有效地降低記憶體的使
用量,記憶體優化的思路包括:
精簡鍵值對大小,鍵值字面量精簡,使用高效二進位制序列化工具。
·使用物件共享池優化小整數物件。
·資料優先使用整數,比字串型別更節省空間。
·優化字串使用,避免預分配造成的記憶體浪費。
·使用ziplist壓縮編碼優化hash、list等結構,注重效率和空間的平衡。
·使用intset編碼優化整數集合。
·使用ziplist編碼的hash結構降低小物件鏈規模
Redis 第8章 物件
redisobject 五種物件 redis中每個物件都由redisobject結構表示,分別是type,encoding,ptr typedef struct redisobjectrobj type 5種 redis string 字串 redis list 列表 redis hash 雜湊表 ...
第8章 理解記憶體
高效利用redis記憶體需要理解記憶體消耗在 然後在管理記憶體,優化記憶體。記憶體消耗分析 管理記憶體的原理和方法 記憶體優化技巧 8.1 記憶體消耗 想理解redis記憶體,首先要知道redis記憶體消耗在哪些方面。可以通過引數調整和合理使用來規避記憶體浪費。記憶體消耗可以分為程序自身消耗和子程序...
redis學習筆記 第1章 初識Redis
速度快 基於鍵值對的資料結構伺服器.豐富的功能 提供了鍵過期功能,可以用來實現快取。提供了發布訂閱功能,可以用來實現訊息系統。支援lua指令碼功能,可以利用lua創造出新的redis命令。提供了簡單的事務功能,能在一定程度上保證事務特性。提供了流水線 pipeline 功能,這樣客戶端能將一批命令一...