使用內(nèi)存包含:
????自身內(nèi)存:一般沒多少,幾百KB? 涧狮;??Lua內(nèi)存 反璃;內(nèi)存碎片
????緩沖內(nèi)存:復(fù)制時的復(fù)制擠壓緩沖區(qū)及客戶端交互的輸出緩沖區(qū)荣月;優(yōu)化就是調(diào)大小、限制連接數(shù)
????對象內(nèi)存:占主要部分袭蝗,數(shù)據(jù)使用內(nèi)存唤殴;優(yōu)化就是正確用數(shù)據(jù)結(jié)構(gòu)
概要:1共享對象、2鍵值對管理到腥、3過期策略朵逝、4淘汰機制、5內(nèi)存最佳實踐(選擇正確數(shù)據(jù)結(jié)構(gòu)乡范、避免大key配名、熱key)
一、共享對象
啟動時創(chuàng)建10000個redisObject晋辆,代表1-10000整型渠脉,一直保存內(nèi)存中,其他對象用時共享使用瓶佳。LRU成員沒用芋膘,沒有其他開銷。
二、鍵值對管理
用redisDb表示數(shù)據(jù)庫为朋,底層用字典類型臂拓,單redis可設(shè)置16個這樣DB;select選擇习寸,不同DB互不影響胶惰。
2.1 過期Key清理
dict結(jié)構(gòu)(dict)存儲鍵值對象;復(fù)用Key霞溪、Value對象童番,沒額外內(nèi)存開銷。
記錄設(shè)過期時間的鍵值對威鹿,固定條件,或者CPU空閑轨香,自動執(zhí)行del清理過期Key忽你。最高25%時間刪除,其他時間管理Redis任務(wù)臂容。
過期Key清理算法(redis.c/activeExpireCycle()函數(shù)實現(xiàn)):
(1)遍歷所有的DB科雳,隨機取20個,過期脓杉,則刪除糟秘。
(2)有大于5個過期,則重復(fù)上一步球散;否則遍歷下一個DB
清理過程中尿赚,到時間限制,退出
2.2 異步刪除
4.0對DEL/FLUSHDB/FLUSHALL引入異步處理蕉堰。FLUSHALL/FLUSHDB 加了一個?ASYNC?參數(shù)凌净,同時新增?UNLINK?來表示異步化的刪除命令。unlike命令實現(xiàn):
三屋讶、過期策略(用2+3)
沒設(shè)置時間冰寻,緩存永不過期;設(shè)置又想永不過期皿渗,用persist key
三種方式:定時刪斩芭、懶漢式刪、定期刪
2.1定時刪
設(shè)置過期時間時乐疆,為key創(chuàng)建定時器划乖,key過期時刪key
????優(yōu)點:內(nèi)存盡快釋放
? ? 缺點:key多占CPU時間、定時器創(chuàng)建耗時诀拭,影響性能
2.2懶漢式刪
用key獲取值時檢查迁筛,過期刪,返回null。優(yōu)缺點:占CPU少细卧,占內(nèi)存
2.3定期刪
每隔一段時間刪尉桩。限制刪時長和頻率,減少前兩個缺點(折中)
四贪庙、淘汰機制
volatile-lru:已設(shè)置過期時間最近最少用
volatile-ttl:已設(shè)置過期時間選要過期
volatile-random:已設(shè)置過期時間任意選
allkeys-lru:最近最少使用淘汰
allkeys-random:任意選數(shù)據(jù)淘汰
no-enviction:禁止淘汰數(shù)據(jù)
淘汰算法:
遍歷所有DB蜘犁,按照淘汰策略挑選一個Key淘汰;
若是lru或ttl止邮,隨機取n個樣本(默認(rèn)為5这橙,可配置),選出最佳值淘汰导披;
超過允許值屈扎,重復(fù)上面
五、內(nèi)存最佳實踐
4.1選擇正確數(shù)據(jù)結(jié)構(gòu)
String用整數(shù)撩匕,浮點型成整數(shù)鹰晨。
量大重要:字符串類合理拆分,對壓縮列表轉(zhuǎn)換條件進行放寬
存Key-Value時止毕,object后加整數(shù)作為ID模蜡,數(shù)據(jù)量大,取模優(yōu)化扁凛,相同前綴Key做hash忍疾。db空間相當(dāng)大的哈希表,把本來分配給整個db空間的Key谨朝,按照不同的前綴分成小的哈希表卤妒,里面數(shù)據(jù)小,用壓縮列表來保存叠必。
4.2 避免BigKey和HotKey
(1)BigKey:http://www.reibang.com/writer#/notebooks/27207290/notes/79614564
(2)HotKey
集群沒合理用:訪問鍵值集中荚孵,遠(yuǎn)高于其他,造成單點故障纬朝,導(dǎo)致集群不可用
拆分HotKey收叶,平均散落各實例
4.3 合理的設(shè)置過期時間
頻繁刪除,會引起阻塞共苛。
4.4 命名規(guī)范
沒有MySQL隔離級別判没、MVCC等數(shù)據(jù)隔離特性,命名額外重要隅茎。
用SDS來保存Key澄峰,大小受String限制,最大512M辟犀。創(chuàng)建時根據(jù)長度選擇底層的實現(xiàn)編碼俏竞。Key設(shè)計最好簡介、明了。
用業(yè)務(wù)名前綴魂毁,防止Key沖突玻佩;不能用特殊字符!
https://blog.csdn.net/xiangnan129/article/details/54928672