內存消耗
used_memory_human:983.98M
used_memory_rss:1096163328
used_memory_peak_human:1017.11M
used_memory_lua:35840
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
- 對象內存:存儲用戶所有key-value數據
- 緩衝內存:客戶端緩衝,複製積壓緩衝區,AOF緩衝區
- 內存碎片:默認內存分配器:jemalloc
內存回收策略
刪除到達過期時間的鍵對象:
惰性刪除(客戶端讀取時檢查刪除)
定時任務刪除
- noeviction:默認,拒絕寫入
- volatile-lru:LRU刪除超時鍵
- allkeys-lru:LRU刪除所有鍵
- allkeys-random:隨機刪除所有鍵
- volatile-random:隨機刪除過期鍵
- volatile-ttl:刪除最近將要過期數據
redisObject對象
Redis優化
- 縮減鍵值對象:降低Redis內存使用最直接的方法:縮減key和value的長度 選擇高效的序列化工具
- 控制鍵的數量:
- 根據鍵規模在客戶端通過分組映射到一組hash對象中
- hash的field可用於記錄原始key字符串
- hash的value保存原始值結構
- hash鍵和field鍵的設計
- 鍵的離散度高時,按照字符串位截取
- 鍵離散度低,用哈希算法打散鍵,哈希field存儲鍵的原始值
- 儘量減少hash鍵和field的長度,如使用部分鍵內容
內存優化場景(面試):
場景:有海量key和value都比較小的數據,在redis中如何存儲才更省內存。
原理:通過大幅減少key的數量來降低內存的消耗。
實現:hash hset,在客戶端通過分組將海量的key根據一定的策略映射到一組hash對象中,由於value較小,故hash類型的對象會使用佔用內存較小的ziplist編碼。
eg:如存在100萬個鍵,可以映射到1000個hash中,每個hash保存1000個元素。
參考查閱資料
https://stackoverflow.com/questions/12779372/hset-vs-set-memory-usage
http://www.voidcn.com/article/p-fsmrzxhx-btp.html
取決於hash-max-ziplist-entries和hash-max-ziplist-value參數的值,將小型散列對象編碼爲ziplists.這是簡單的數據序列化