版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
### 內(nèi)存淘汰
Redis內(nèi)存不足時(shí),有兩種處理方式:
(1)啟用虛擬內(nèi)存:將vm-enabled設(shè)置為yes
(2)啟用內(nèi)存淘汰:將maxmemory設(shè)置為一個(gè)大于0的整數(shù)
redis的使用內(nèi)存大于最大分配可用內(nèi)存時(shí),開始進(jìn)行淘汰,memcache只有LRU算法,redis有
1 隨機(jī)淘汰:從數(shù)據(jù)庫隨機(jī)刪除一個(gè)key
2 LRU算法:刪除一個(gè)最近最少訪問的key
3 TTL淘汰:刪除最快過期的key
### 對象引用計(jì)數(shù)器
為了防止一個(gè)客戶端調(diào)用get的同時(shí),另一個(gè)client調(diào)用del刪除key而導(dǎo)致的內(nèi)存端錯(cuò)誤,redis使用了內(nèi)存引用計(jì)數(shù)器:給對象添加一個(gè)引用計(jì)數(shù)器,有新的引用時(shí),計(jì)數(shù)+1 ,引用失效,計(jì)數(shù)器-1 ,引用計(jì)數(shù)為0時(shí),redis把key刪除,對象初始化時(shí),引用計(jì)數(shù)為1 get時(shí),引用+1 del時(shí),引用-1
eg:實(shí)例化refcount=1
get refcount=2
del refcount=1
get結(jié)束 refcount=1,此時(shí)可以被刪除
### 自動關(guān)閉超時(shí)連接
server.idletime是設(shè)置的timeout的時(shí)間,timeout=0時(shí),自動關(guān)閉不會觸發(fā)
當(dāng)連接建立,卻不做任何操作時(shí),超過timeout會自動斷開連接,當(dāng)使用連接池時(shí),不用配置timeout的時(shí)間,否則連接池里的連接會因超時(shí)而斷開
### redis清除過期數(shù)據(jù)
redis為每個(gè)存儲的數(shù)據(jù)設(shè)置一個(gè)過期時(shí)間,超過這個(gè)時(shí)間,redis把過期數(shù)據(jù)刪除,redis刪除數(shù)據(jù)分兩個(gè)階段
(1)在定時(shí)器serverCron中進(jìn)行,每隔100ms執(zhí)行一次
activeExpireCycle隨機(jī)獲取一些key,如果當(dāng)前時(shí)間>數(shù)據(jù)設(shè)置的過期時(shí)間,刪除key,如果這些key有25%的數(shù)據(jù)過期,清理過程會繼續(xù)進(jìn)行,以釋放更多的內(nèi)存
(2)在用戶get時(shí),如果key的expiretime<time(),刪除數(shù)據(jù)
新聞熱點(diǎn)
疑難解答
圖片精選