小物件壓縮
32bit vs 64bit
小物件壓縮
public
class
arraymap
}keys.
add(k)
; values.
add(v)
;return null;
}public v get
(k k)
}return null;
}public v delete
(k k)
}return null;
}}
新docker-redis:
0>hset hello a 1
"1"新docker-redis:
0>hset hello b 2
"1"新docker-redis:
0>object encoding hello
"ziplist"
新docker-redis:
0>zadd world 1 a
"1"新docker-redis:
0>zadd world 2 b
"1"新docker-redis:
新docker-redis:
0>sadd hello 1
2"2"
新docker-redis:
0>object encoding hello
"intset"
新docker-redis:
0>sadd hello yes no
"2"新docker-redis:
0>object encoding hello
"hashtable"
總結hash
-max
-z 工pl 工 st entries 512 結構儲存 # hash 的元素個數超過 512 就必須用標準
hash
-max
-ziplist-value 64 超過 64 就必須用標準結構儲存 # hash 的任意元素的 key/value 的長度超過64 就必須用標準結構儲存
list
-max
-ziplist-entries 512 結構儲存 # list 的元素個數超過 512 就必須用標準結構儲存
list
-max
-z 工plist - value 64 用標準結構儲存 # list 的任意元素的長度超過 64 就必須用標準結構儲存
zset-
max-ziplist-entries 128 結構儲存 # zset 的元素個數超過 128 就必須用標準結構儲存
zset-
max- ziplist-value 64 用標準結構儲存 # zset 的任意元素的長度超過 64 就必須用標準結構儲存
set-
max-intset-entries 512 標準結構儲存 # set 的整數元素個數超過 512 就必須用標準結構儲存
public
static
void
main
(string[
] args)
system.out.
println
(jedis.
objectencoding
("books"))
; jedis.
hset
("books"
,"hello"
,"512");
system.out.
println
(jedis.
objectencoding
("books"))
;}//輸出如下:
ziplist
hashtable
記憶體**機制
記憶體分配演算法
jemalloc效能優於tcmalloc,redis預設使用jemalloc
新docker-redis:
0>info memory
"# memory
used_memory:
5110711968..
...mem_fragmentation_ratio:
1.33
mem_allocator:jemalloc-
4.0.3
active_defrag_running:
0lazyfree_pending_objects:
0
Redis小物件的壓縮儲存
redis hash是value內部為乙個hashmap,如果該map的成員數比較少,則會採用類似一維線性的緊湊格式來儲存該map,即省去了大量指標的記憶體開銷,這個引數控制對應在redis.conf配置檔案中下面2項 以上2個條件任意乙個條件超過設定值都會轉換成真正的hashmap,也就不會再節省...
Redis 小物件壓縮
redis 是乙個非常耗費記憶體的資料庫,它所有的資料都放在記憶體裡。如果我們不注意節約使用記憶體,redis 就會因為我們的無節制使用出現記憶體不足而崩潰。1 ziplist 是乙個緊湊的位元組陣列結構,每個元素直接都是緊挨著,資料結構如下圖 1 object encoding key 查詢key...
小物件壓縮
鑑於redis是純記憶體資料庫,為了盡可能的節省記憶體開銷避免因為記憶體不足而崩潰,redis對一部分資料結構進行了優化。編譯 如果使用32位進行編譯,內部所有資料結構所使用的指標空間占用會少一半,如果使用記憶體不超過4g,可以考慮使用32位進行編譯,如果不足還可以通過增加例項的方式來解決。壓縮 這...