redis常用記憶體優化手段與引數

2021-07-11 11:01:45 字數 2255 閱讀 1592

通過上面的實現上的分析,可以看出redis的記憶體管理成本比較高,即占用了過多的記憶體,redis的作者對這點也很清楚,所以提供了一系列的引數和手段來控制和節省記憶體:

首先最重要的一點是不要開啟redis的vm選項,即虛擬記憶體功能。這個本來是作為redis儲存超出物理記憶體資料的一種資料在記憶體與磁碟換入換出的乙個持久化策略,但是其記憶體管理成本也很搞,並且我們後續會分析此種持久化策略並不成熟,所以關閉vm功能,所以請設定redis.conf檔案中 的vm-enabled 為no。

其次,最好設定下redis.conf中的maxmemory選項,該選項告訴redis當使用了多少物理記憶體後就開始拒絕後續的寫入請求,該引數能很好的保護好你的redis不會因為使用過多的物理記憶體而導致swap,最紅嚴重影響效能甚至崩潰。

另外redis為不同資料型別分別提供了一組引數來控制記憶體使用,我們前面詳細分析過redis hash是value內部為乙個hashmap,如果該map 的成員比較少,則會採用類似一維線性的緊湊格式來儲存該map,即省去了大量指標的記憶體開銷,這個從拿書控制對應在redis.conf配置檔案中下面兩項:

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

hash-max-zipmap-entres

含義是當value這個map內部不超過多少成員時會採用線性緊湊格式儲存,預設是64,即 alue內部有64個以下的成員就是使用線性緊湊儲存,超過該值就自動轉成真正的hashmap。

hash-max-zipmap-value 含義是當alue 這個map內部的每個成員值長度不超過多少位元組就會採用線性緊湊儲存來節省空間。

以上兩個條件,任意一條超過設定就會轉成真正的hashmap,也就不會再節省記憶體了,那麼這個值是不是設定的越大越好呢。答案當然是否定的,hashmap的優勢就是查詢和操作的時間複雜度都是o(1)的,而放棄hash採用一維儲存則是o(n)的時間複雜度,如果成員數量很少,則影響不大,否則嚴重影響效能,所以要權衡這個值的設定。總體上是最根本的時間成本和空間成本上的權衡。

同類引數還有:

list-max-ziplist-entries 512

說明:list資料型別多少節點以下會採用去指標的緊湊儲存格式。

list-max-ziplist-value 64

說明:list資料型別節點值大小系哦啊與多少位元組會採用緊湊儲存格式。

set-max-inset-entries 512

說明set資料型別內部資料如果全部是數值型,且包含多少字節點以下,會採用緊湊儲存格式。

redis內部實現沒有對記憶體分配方面做過多的優化,一定程度上回存在記憶體碎片,不過大多數的情況下,這個不會成為redis的效能瓶頸。不過如果在redis內部儲存的大部分是數值型的話,redis內部採用了乙個shared integer的方式來省去分配記憶體的開銷,即在系統啟動是先分配乙個從1~n那麼多個數值物件放在乙個池子中,如果儲存的資料恰好是這個數值範圍內的資料,則直接誒從池子裡取出物件。並且通過引用技術的方式來分享。這樣在系統儲存了大量數值下,也能在一定程度上節省記憶體並且提高ixngneng,這個引數值n的設定需要修改源**中的一行巨集定義:redis_shared_intergers,該值預設為10000,可以根據自己的需要進行修改,修改後重新編譯就可以了。

redis的持久化機制:

四種持久化方式:

定時快照方式---snapshot----------定時器事件---固定時間點檢查當前資料發生的改變次數與時間是否滿足觸發持久化的條件。滿

足時,就通過fork呼叫來建立乙個子程序。

這個子程序缺省會與父程序共享相同的位址空間,這時就可以通過子程序來遍歷整個記憶體來進行儲存操作,而主程序則仍然可以提供服務,當有寫入時由作業系統按照記憶體頁(page)為單位來進行copy-on-write保證父子程序之間不會互相影響。

該持久化的主要缺點是定時快照只是代表一段時間內的記憶體映像,所以系統重啟會丟失上次快照與重啟之間所有的資料

基於語句追加檔案的方式------aof-------類似mysql基於語句的binlog方式,即每條會使redis記憶體資料發生改變的命令都會追加到

乙個log檔案中,也就是說這個log檔案就是redis的持久化資料。

缺點是:追加log檔案可能導致體積過大,當系統重啟恢復資料時如果是aof的方式則載入資料會非常緩慢

虛擬記憶體----vm--------已被遺棄。。。。

diskstore方式-------b-tree

設計思路上,前兩種基於全部資料都在記憶體中,即小資料量下提供磁碟落地功能。

後兩種方式則是作者在嘗試儲存資料超過物理記憶體時,即大資料量的資料儲存。仍在實驗階段

常用的效能優化手段(記憶體優化方法)

1.使用 arc 進行記憶體管理,arc 是 ios 提供的採用自動引用計數方式進行管理記憶體的一種手法,它避免了最常見的忘記釋放物件記憶體而引起的記憶體洩漏問題。它的工作原理是編譯器會自動的為你管理 retain 和 release 過程。2.復用 reuseidentifier,在使用單元格時應...

常用的 Redis 優化手段有哪些?

每個軟體的常規操作有兩種,一種是使用,另一種就是調優,對於 redis 來說也是一樣。關於 redis 調優的問題一般會出現在 redis 面試的後期,以此來考察面試者對於 redis 的實際應用掌握,以及對於 redis 高效能的追求與理解,因此本文就來重點的聊一聊關於 redis 調優的相關問題...

sql常用優化手段

常見優化手段 where及order by的列建索引 避免在 where 子句中使用 或 操作符,否則將引擎放棄使用索引而進行全表掃瞄。避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,可以在字段上設定預設值0 避免在 where 子句中使用 or 來...