看過許多redis優(yōu)化的案例浑测,通過引入hashmap的方式將key散列到多個hashmap榴嗅,
具體可以見:
Redis 利用Hash存儲節(jié)約內(nèi)存 - 劉本龍的專欄 - CSDN博客
我們得到如下公式:
key的數(shù)量=hashmap數(shù)量* 每個hashmap filed的數(shù)量
原來是:
key1,key2,key3,key4,key5
變成
hash1:
key1:value1
key2:value2
key3:value2
hash2:
key4:value4
key5:value5
雖然名義上5個key變成了2個hashmap猴贰,但是每個filed還是會保存原始的key揭绑,所以從key減少的層面是行不通的坦报,這個時候就要從底層儲存結(jié)構(gòu)去看上煤。
redis對hashmap有一個優(yōu)化休玩,當(dāng)filed數(shù)量比較少的時候(因?yàn)閦iplist是用順序遍歷的方式查找元素,所以數(shù)量多了復(fù)雜度是o(N)肯定不合適劫狠。
)拴疤,會用一個叫ziplist的結(jié)構(gòu)保存,而不是傳統(tǒng)的hash結(jié)構(gòu)独泞,ziplist有幾個特點(diǎn):
1 ziplist申請一個快連續(xù)的內(nèi)存呐矾,所有元素是緊挨著存放,能夠減少內(nèi)存碎片
2 通過offset來標(biāo)識前后元素的位置,不需要額外的指針阐肤,也可以減少對象
ziplist介紹
https://blog.csdn.net/weixin_30783913/article/details/98141347
所以hashmap能省內(nèi)存是依賴ziplist的結(jié)構(gòu)凫佛,而不是key的減少。
使用ziplist可以用以下參數(shù)控制
hash-max-zipmap-entries 512 #配置字段最多512個
hash-max-zipmap-value 64 #配置value最大為64字節(jié)孕惜。
必須滿足以上兩個條件愧薛,那么該key會被壓縮。否則就是按照正常的hash結(jié)構(gòu)來存儲hash類型的key衫画。