Redis內存優化,讀書筆記整理

一直想着自己部署的Redis集羣,只是簡單的部署,肯定還有很大的優化空間。萬一哪天用戶暴增,出現了問題,我是不是得有幾個備選方案?碰巧看了幾篇Redis內存優化的文章,它們給了我很大的啓發,在此用自己的語言整理一下,分享給大家。

Redis內存優化的目的:使用更少的空間存儲更多的數據。

優化建議如下所示:

1. 鍵值對優化

1)減少鍵值key的長度,鍵名儘量精簡,能縮寫的縮寫;

key規則: 業務名:表名:ID;

key使用embstr編碼:開闢一塊連續分配的內存(字符串長度小於等於44 字節);

2)value進行數據壓縮;

3)value使用性能更好的佔比更小的序列化方式;

2.小數據集合的編碼優化

採用bitmap存儲

setbit 前綴 key value

getbit 前綴 key

bitcount 前綴 // 統計

參考:https://mp.weixin.qq.com/s/ejlPNOuTu0owvsVdCwKPvw

3.使用對象共享池

redis在啓動的時候會生成0-9999個整數對象池供對象複用,減少內存佔用;

在採用ziplist 編碼、設置maxmemory限制時失效;

4.使用 Bit 比特位或 byte 級別操作;

bitmap是一個以bit爲單位的數組,數組的每個單元只能存儲0和1,數組的下標是offset偏移量;

5.使用hash類型優化;

value能用hash的不用string;

6.內存碎片優化;

在redis.conf中開啓activedefrag yes 相關配置;

7.使用32位的redis;

細說內存碎片優化

  1. 在redis客戶端通過命令 info memory 查看內存信息,需要關注以下幾個信息:
# redis分配的內存總量單位爲b
used_memory: 
# redis分配的內存總量單位爲M
used_memory_human: 
# redis向操作系統申請的內存總量單位爲b
used_memory_rss: 
# redis向操作系統申請的內存總量單位爲M
used_memory_rss_human:
# 內存碎片率
mem_fragmentation_ratio:
# 內存分配器
mem_allocator:jemalloc-5.1.0 

mem_fragmentation_ratio計算公式爲:used_memory_rss/used_memory該值過高時考慮清理內存;

  1. 打開 redis.conf 配置文件,需要開啓以下屬性,默認都是關閉的;
# 開啓自動清理內存碎片
activedefrag yes 
# 內存碎片的字節數達到100M時開始清理
active-defrag-ignore-bytes 100mb 
# 內存碎片空間佔操作系統分配給redis的總空間比例達到 10% 時開始清理
active-defrag-threshold-lower 10 
# 兩個條件同時滿足會觸發內存碎片清理,當有一個不滿足則停止清理
# active-defrag-ignore-bytes與active-defrag-threshold-lower
# 內存碎片超過 100%,則盡最大努力整理
active-defrag-threshold-upper 100
# 自動清理過程所用CPU時間的比例不低於1%,保證能正常清理
active-defrag-cycle-min 1
# 自動清理過程所用CPU時間的比例不高於25%,超過25%停止清理,避免redis主線程阻塞
active-defrag-cycle-max 25
# 自動清理過程中長度小於1000的set/hash/zset/list纔會進行自動清理
active-defrag-max-scan-fields 1000

注意點:內存碎片優化,只支持redis4.0以上版本,windows安裝的redis 3點幾版本是不支持的。
參考鏈接:https://www.csdn.net/tags/Mtzakg5sNDkxMDQtYmxvZwO0O0OO0O0O.html

本文參考:https://mp.weixin.qq.com/s/HzBLqWaJyadnTsA-bB0ivg

最後總結
通過以上三篇文章的學習,學到了7個關於Redis內存優化的方法。第1、5點是關於鍵值對存儲的優化,想辦法減少數據存儲的數量;第2、3、4點和業務邏輯有關,是否有這方面的需要,如果有可以這樣存儲。第6點是開啓內存自動清理的優化。第7點是在redis存儲結構上做整體調整。有了這幾點優化方針做指導,能優化趕緊做起來吧。

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