Redis 記憶體優化理解和儲存總結

2021-06-06 21:19:27 字數 2118 閱讀 6187

1.redis 儲存機制

redis儲存機制分成兩種snapshot 和 aof。無論是那種機制,redis都是將資料儲存在記憶體中。

snapshot工作原理: 是將資料先儲存在記憶體,然後當資料累計達到某些設定的伐值的時候,就會觸發一次dump操作,將變化的資料一次性寫入資料檔案(rdb檔案)。

aof 工作原理: 是將資料也是先存在記憶體,但是在儲存的時候會使用呼叫fsync來完成對本次寫操作的日誌記錄,這個日誌揭露檔案其實是乙個基於redis網路互動協議的文字檔案。aof呼叫fsync也不是說全部都是無阻塞的,在某些系統上可能出現fsync阻塞程序的情況,對於這種情況可以通過配置修改,但預設情況不要修改。aof最關鍵的配置就是關於呼叫fsync追加日誌檔案的平率,有兩種預設頻率,always每次記錄進來都新增,everysecond 每秒新增一次。兩個配置各有所長後面分析。由於是採用日誌追加的方式來持久話資料,所以引出了第二個日誌的概念:rewrite. 後面介紹它的由來。

儲存模式效能和安全比較:

1.效能:snapshot方式的效能是要明顯高於aof方式的,原因有兩點:

2.資料安全:aol資料安全性高於snapshot儲存,原因:

說完了效能和安全,這裡不得不提的就是在redis中的rewrite的功能,aof的儲存是按照記錄日誌的方式去工作的,那麼成千上萬的資料插入必然導致日誌檔案的擴大,redis這個時候會根據配置合理觸發rewrite操作,所謂rewrite就是將日誌檔案中的所有資料都重新寫到另外乙個新的日誌檔案中,但是不同的是,對於老日誌檔案中對於key的多次操作,只保留最終的值的那次操作記錄到日誌檔案中,從而縮小日誌檔案的大小。這裡有兩個配置需要注意:

auto-aof-rewrite-percentage 100 (當前寫入日誌檔案的大小佔到初始日誌檔案大小的某個百分比時觸發rewrite)

auto-aof-rewrite-min-size 64mb (本次rewrite最小的寫入資料良)

兩個條件需要同時滿足。

2.redis記憶體優化理解

redis內部有很多的資料型別,這些在官方文件上都可以看到,下面是其內部優化的一些細節點:

1. string 和 數字,在redis中如果儲存的是「123」redis是能夠識別出來這是乙個數字並且按照數字來儲存,節省儲存空間,當然除了這個優化之外,redis內部會構建乙個數字池,預設是10000,那麼如果是在這個池子的數字就只需要用乙個簡單的索引來引用進來就可以,而不需要把重複的數字都分開儲存。這個數值可以調整源**的巨集:redis_shared_integers來擴大和縮小池子的大小。

2.複雜型別的儲存優化,比如map,list,set等,這些集合都有乙個特點可大可小,根據實際場景來定,一般情況下如果這些集合所包含的entry不多,並且每個entry所包含的value不是很長的情況下,redis內部使用緊湊格式來儲存資料,緊湊格式儲存資料在查詢場景的演算法複雜度是o(n),而類似map或者set他們的查詢演算法複雜度都是o(1)那為什麼要這麼做呢 ?為了能夠節省記憶體空間,在n很小的時候其實和o(1)沒什麼區別。所以這裡不的不介紹緊湊格式的代表zipmap,他的資料結構是這樣:

可以看出,這個結構中初始情況只有2個位元組,隨著操作的增加它會變長,其中最關鍵的是乙個關於free這個欄位的理解,以map為例,如果新插入乙個key,那麼對應zipmap就會多出來一長串資料:。從圖中可以看到插入key1的時候只有綠色的一串,當key2插入的時候就會又出來乙個類似的黃色結構串。free的功能是在插入的時候用來冗餘空間的,當key所對應的數值發生變化的時候,如果資料變的比之前短了,那麼free的長度就變大,這個時候不需要做zipmap的resize操作,如果資料長度變長了,並且在free能夠足以支援新資料的範圍之內,那麼free就被利用起來,並且也不需要做resize。這個時候會有空間的浪費或者說碎片。空間換時間吧,沒什麼好說的。當然redis的**中還有另外乙個引數zipmap_value_max_free,這個引數可以用來設定如果free的大小超過了這個值,那麼zipmap會發生resize(收縮),從而節約空間。

接觸的不久,先說這麼多好了。

Redis記憶體使用優化與儲存

在具體描述這幾種資料型別之前,我們先通過一張圖了解下redis內部記憶體管理中是如何描述這些不同資料型別的 首先redis內部使用乙個redisobject物件來表示所有的key和value,redisobject最主要的資訊如上圖所示 type代表乙個value物件具體是何種資料型別,encodi...

Redis記憶體使用優化與儲存

redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之前,我們先通過一張圖了解下redis內部記憶體管理中是如何描述這些不同資料型別的 首先redis內部使用乙個redisobject物件來表示所有的key和value,redisobject最主要的資訊如上圖所示 type代表乙個v...

Redis記憶體使用優化與儲存

redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之前,我們先通過一張圖了解下redis內部記憶體管理中是如何描述這些不同資料型別的 首先redis內部使用乙個redisobject物件來表示所有的key和value,redisobject最主要的資訊如上圖所示 type代表乙個v...