title: redis內(nèi)存模型
date: 2020-12-02 21:12:14
categories: redis
tags:
- 內(nèi)存
description: redis基礎(chǔ)介紹谦去,包括概念以及使用方法
內(nèi)存消耗統(tǒng)計
Redis進(jìn)程內(nèi)存占用主要可以劃分為以下幾個部分:
- 自身內(nèi)存,也就是程序的內(nèi)存蹦哼,一般來說非常小鳄哭,可能只有幾MB
- 對象內(nèi)存,也就是存儲的數(shù)據(jù)纲熏,采用key-value的方式妆丘,每次至少創(chuàng)建兩個類型對象。
- 緩沖內(nèi)存局劲,各種緩沖區(qū)勺拣,客戶端緩沖(輸入輸出)、復(fù)制積壓緩沖區(qū)鱼填、AOF緩沖區(qū)
- 內(nèi)存碎片:used_memory_rss - used_memory,內(nèi)存碎片是Redis在分配药有、回收物理內(nèi)存過程中產(chǎn)生的。內(nèi)存碎片產(chǎn)生原因主要是對數(shù)據(jù)的頻繁修改造成苹丸,導(dǎo)致Redis釋放的空間在物理內(nèi)存中并沒有被釋放愤惰。在處理數(shù)據(jù)時,應(yīng)該盡量數(shù)據(jù)對齊赘理,防止大小不均宦言。若Redis服務(wù)器中內(nèi)存碎片很大,可以通過安全重啟方式釋放內(nèi)存商模。
Redis自帶一個內(nèi)存統(tǒng)計的命令info memory
奠旺,可以查看內(nèi)存相關(guān)指標(biāo),每個指標(biāo)都有兩個值施流,一個是以字節(jié)為單位响疚,一個是可讀方式,也就是M或者G等瞪醋,這里列舉幾個重要的且可讀的指標(biāo):
- used_memory:1.85M 內(nèi)存總量忿晕,也就是數(shù)據(jù)占用的內(nèi)存
- used_memory_rss:13.94M 占用物理內(nèi)存總量
- used_memory_peak:1.89M 內(nèi)存使用的最大值
- used_memory_peak_perc:97.94%
- mem_fragmentation_ratio:7.68 used_memory_rss/used_memory 代表內(nèi)存碎片率
- used_memory_dataset:19334 數(shù)據(jù)集
子進(jìn)程內(nèi)存消耗
子進(jìn)程內(nèi)存消耗主要在執(zhí)行AOF/RDB重寫時Redis創(chuàng)建的子進(jìn)程內(nèi)存消耗。Linux具有寫時復(fù)制技術(shù)(copy-on-write),也就是使用內(nèi)存快照趟章,共享物理內(nèi)存頁杏糙,父進(jìn)程只是對修改復(fù)制一份副本。
Linux 2.6.38增加了Transparent Huge Pages(THP)機(jī)制蚓土。開啟與關(guān)閉該功能宏侍,對子進(jìn)程內(nèi)存消耗影響巨大。
內(nèi)存管理
-
設(shè)置內(nèi)存上限:
- 當(dāng)超出內(nèi)存上限時蜀漆,會觸發(fā)LRU等策略釋放內(nèi)存谅河。
- 防止內(nèi)存超出物理內(nèi)存,注意設(shè)置的是used_memory的量确丢,并不包括碎片占用的
動態(tài)調(diào)整內(nèi)存上限
-
內(nèi)存回收策略
Redis每個鍵都可以設(shè)置過期屬性绷耍,但由于保留了大量的鍵,維護(hù)每個鍵消耗太大鲜侥,幾乎不可能褂始,因此redis采用的是惰性刪除和定時任務(wù)刪除機(jī)制來實現(xiàn)過期鍵的回收。- 惰性刪除:當(dāng)客戶端訪問一個鍵描函,redis這時會判斷它是否過期崎苗,如果過期就刪除并返回空。
- 定時任務(wù)刪除:默認(rèn)每秒運行10次舀寓,采用自適應(yīng)算法胆数,根據(jù)鍵的過期比例采用快慢兩種模式回收,
-
內(nèi)存溢出控制策略互墓,受參數(shù)maxmemory-policy控制
- noeviction:默認(rèn)策略必尼,不刪除數(shù)據(jù),但拒絕寫入并返回錯誤信息
- volatile-lru: 根據(jù)LRU算法刪除鍵篡撵,直到騰出足夠空間
- allkeys-random: 隨機(jī)刪除所有鍵判莉,直到騰出足夠空間
- volatile-random:隨機(jī)刪除過期鍵,直到騰出空間
- volatile-ttl: 根據(jù)對象ttl屬性育谬,刪除最近將要過期的數(shù)據(jù)骂租,如果沒有會退到noeviction