有海量key和value都比較小的數據,在redis中如何存儲才更省內存引出Redis內存管理,消耗和優化

內存消耗


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的長度 選擇高效的序列化工具 
  • 控制鍵的數量:
  1. 根據鍵規模在客戶端通過分組映射到一組hash對象中
  2. hash的field可用於記錄原始key字符串
  3. hash的value保存原始值結構
  • hash鍵和field鍵的設計
  1. 鍵的離散度高時,按照字符串位截取
  2. 鍵離散度低,用哈希算法打散鍵,哈希field存儲鍵的原始值
  3. 儘量減少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.這是簡單的數據序列化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章